【问题标题】:Problem with get/read Related Data in ASP.NET Core 6.0ASP.NET Core 6.0 中获取/读取相关数据的问题
【发布时间】:2023-02-08 23:00:39
【问题描述】:

我正在尝试在大陆详细信息页面中可视化当前大陆的数据相关国家/地区。

如果我们使用 Razor 页面,功能如下所示:

public async Task<IActionResult> OnGetAsync(string id)
{
    Continent = await _context.Continents
                              .Include(c => c.Countries)
                              .AsNoTracking()
                              .FirstOrDefaultAsync(m => m.ID == id);

    if (Continent == null)
    {
        return NotFound();
    }

    return Page();
}

我正在尝试在 ASP.NET Core MVC 控制器中发出相同的请求:

public async Task<IActionResult> Details(string id)
{
    if (id == null || _context.Continents == null)
    {
        return NotFound();
    }

    var continent = await _context.Continents
                                  .Include(x => x.Countries)
                                  .AsNoTracking()
                                  .FirstOrDefaultAsync(m => m.ID == id);

    if (continent == null)
    {
        return NotFound();
    }

    return View(continent);
}

但是 Countries 被标记为红色:

错误 CS1061
“Continent”不包含“Countries”的定义,并且找不到接受“Continent”类型的第一个参数的可访问扩展方法“Countries”(您是否缺少 using 指令或程序集引用?)
C:\Users\Partsmaster\source\repos\RazorCountry\RazorCountry\Controllers\ContinentsController.cs

我应该如何正确修改 ASP.NET Core MVC 控制器中的读取相关数据?

大陆控制器.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using RazorCountry.Data;
using RazorCountry.Models;
using RazorCountry.Models.ViewModels;

namespace RazorCountry.Controllers
{
    public class ContinentsController : Controller
    {
        private readonly AppDbContext _context;

        public ContinentsController(AppDbContext context)
        {
            _context = context;
        }
        
        // GET: Continents
        public async Task<IActionResult> Index(string searchString, string chosenFilter)
        {
            var viewModel = new ContinentViewModel();

            IQueryable<Continent> continents = _context.Continents;
            
            if (!String.IsNullOrEmpty(searchString))
            {
                switch (chosenFilter)
                {
                    case "id":
                        viewModel.Filter = "id";
                        continents = continents.Where(s => s.ID.Contains(searchString));
                        break;

                    case "name":
                        viewModel.Filter = "name";
                        continents = continents.Where(s => s.Name.Contains(searchString));
                        break;
                }
            }

            viewModel.Continents = continents;
            viewModel.SearchString = searchString;

            return View(viewModel);
        }

        // GET: Continents/Details/5
        public async Task<IActionResult> Details(string id)
        {
            if (id == null || _context.Continents == null)
            {
                return NotFound();
            }

            var continent = await _context.Continents.Include(x => x.Countries).AsNoTracking()
                .FirstOrDefaultAsync(m => m.ID == id);

            if (continent == null)
            {
                return NotFound();
            }

            return View(continent);
        }

        // GET: Continents/Create
        public IActionResult Create()
        {
            return View();
        }

        // POST: Continents/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("ID,Name")] Continent continent)
        {
            if (ModelState.IsValid)
            {
                _context.Add(continent);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }

            return View(continent);
        }

        // GET: Continents/Edit/5
        public async Task<IActionResult> Edit(string id)
        {
            if (id == null || _context.Continents == null)
            {
                return NotFound();
            }

            var continent = await _context.Continents.FindAsync(id);

            if (continent == null)
            {
                return NotFound();
            }
            return View(continent);
        }

        // POST: Continents/Edit/5
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(string id, [Bind("ID,Name")] Continent continent)
        {
            if (id != continent.ID)
            {
                return NotFound();
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(continent);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!ContinentExists(continent.ID))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }

                return RedirectToAction(nameof(Index));
            }

            return View(continent);
        }

        // GET: Continents/Delete/5
        public async Task<IActionResult> Delete(string id)
        {
            if (id == null || _context.Continents == null)
            {
                return NotFound();
            }

            var continent = await _context.Continents
                .FirstOrDefaultAsync(m => m.ID == id);

            if (continent == null)
            {
                return NotFound();
            }

            return View(continent);
        }

        // POST: Continents/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(string id)
        {
            if (_context.Continents == null)
            {
                return Problem("Entity set 'AppDbContext.Continents'  is null.");
            }

            var continent = await _context.Continents.FindAsync(id);

            if (continent != null)
            {
                _context.Continents.Remove(continent);
            }
            
            await _context.SaveChangesAsync();

            return RedirectToAction(nameof(Index));
        }

        private bool ContinentExists(string id)
        {
          return _context.Continents.Any(e => e.ID == id);
        }
    }
}

尝试理解“阅读相关数据”。可能我需要添加一些 ViewModel 并重写 Details 脚本?

【问题讨论】:

    标签: asp.net-core-mvc asp.net-core-6.0


    【解决方案1】:

    错误清楚地指出:

    'Continent' does not contain a definition for 'Countries'...
    

    您应该改用...Include(x =&gt; x.Country)...


    我几乎可以肯定您在模型中使用了单数名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 2021-06-20
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多