当我使用 DropDownListFor 时,我可以显示所选项目但 Id 不正确

When I use DropDownListFor, I can display the selected item but the Id is not true

我有两个不同的 table,其中一个是产品,另一个是类别。 Categories table 有两列,分别是 Id 和 Name, Products table 有四列,分别是 Name、TWS、OWS 和 CategoryId。我在标题页上显示 CategoryName 而不是 CategoryId。

我有创建页面来添加产品。在此页面中,我想使用下拉列表添加 CategoryId,我想再次显示 CategoryName 而不是 Category Id。

首先,我研究了 Create() 方法。

public IActionResult Create()
    {
        List<SelectListItem> selectListItem = _context.Categories.
                                               Select(i=> new SelectListItem()
                                               {
                                                   Text = i.Name,
                                                   Value = i.Id.ToString()
                                               }).ToList();
        ViewBag.selectedListItem = selectListItem;
        return View();
    }

之后我在 Create.cshtml

上工作
<div class="form-group">
                <label asp-for="CategoryId" class="control-label"></label>
                @Html.DropDownListFor(m => m.Category.Id,(List<SelectListItem>)ViewBag.selectedListItem, new {@class="form-group"})
                <span asp-validation-for="CategoryId" class="text-danger"></span>
            </div>

m => m.Category.Id 这里的类别来自 Project.Models.Products.

最后,我研究了 Create(Products products) 方法。

public async Task<IActionResult> Create(Products products)
    {

        if (ModelState.IsValid)
        {
            Products existingTitle = await _context.Products.SingleOrDefaultAsync(
               x => x.Name == products.Name);

            if (existingTitle != null)
            {
                ModelState.AddModelError(string.Empty, "This data already exists.");
                return View(products);
            }
            else
            {
                var ctg = _context.Categories.Where(m =>m.Id==products.Category.Id).FirstOrDefault();
                products.Category= ctg;
                products.Id = Guid.NewGuid();
                _context.Add(products);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }

            
        }
        return View(products);
    }

我在尝试添加新产品时遇到此错误。 处理请求时出现未处理的异常。 NullReferenceException:Object 引用未设置为 object 的实例。 lambda_method(关闭)

我这样修改了代码:

var ctg = _context.Categories.Where(m =>m.Id==products.CategoryId).FirstOrDefault();

这次可以添加商品,但是商品的categoryid不等于选择的分类。类别 ID 始终为 00000000-0000-0000-0000-000000000000。

那么,我该如何解决这个问题。

我不太清楚你的模型之间的关系,但你可以在下面看到我的一个简单的工作示例。

型号:

public class Category
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}
public class Product
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string TWS { get; set; }
    public string OWS { get; set; }
    public Category Category { get; set; }
    public Guid CategoryId { get; set; }
}

操作:

 public IActionResult Create()
    {
        List<SelectListItem> selectListItem = _context.Categories.
                                               Select(i => new SelectListItem()
                                               {
                                                   Text = i.Name,
                                                   Value = i.Id.ToString()
                                               }).ToList();
        ViewBag.selectedListItem = selectListItem;
        return View();
    }
    [HttpPost]
    public async Task<IActionResult> Create(Product products)
    {

        if (ModelState.IsValid)
        {
            Product existingTitle = await _context.Products.SingleOrDefaultAsync(
               x => x.Name == products.Name);

            if (existingTitle != null)
            {
                ModelState.AddModelError("Error", "This data already exists.");
                List<SelectListItem> selectListItem = _context.Categories.
                                             Select(i => new SelectListItem()
                                             {
                                                 Text = i.Name,
                                                 Value = i.Id.ToString()
                                             }).ToList();
                ViewBag.selectedListItem = selectListItem;
                return View();
            }
            else
            {
                var ctg = _context.Categories.Where(m => m.Id == products.Category.Id).FirstOrDefault();
                products.Category = ctg;
                products.Id = Guid.NewGuid();
                _context.Add(products);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
        }
        return View();
    }

查看:

@model Product
@{
    ViewData["Title"] = "Create";
}
<form asp-action="Create">
    <div class="form-group">
        <span class="text-danger">@Html.ValidationMessage("Error")</span>
        <input asp-for="Name" />
        @*//...*@
        <label asp-for="CategoryId" class="control-label"></label>
        @Html.DropDownListFor(m => m.Category.Id, (List<SelectListItem>)ViewBag.selectedListItem, new { @class = "form-group" })
        <span asp-validation-for="Category.Id" class="text-danger"></span>
    </div>
    <input type="submit" value="Save"/>
</form>

顺便说一句,如果你想使用代码:

var ctg = _context.Categories.Where(m =>m.Id==products.CategoryId).FirstOrDefault();

您需要将下拉列表更改为:

 @Html.DropDownListFor(m => m.CategoryId,(List<SelectListItem>)ViewBag.selectedListItem, new {@class="form-group"})

测试结果: