当我使用 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"})
测试结果:
我有两个不同的 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"})
测试结果: