我是 MVC 新手,在理解模型和模型绑定方面遇到了一些困难,并且在查找此文档时遇到了困难。当发布对此模型的更改时,我在供应商和类别上得到 ModelState.IsValid = False。
型号:
public class Products
{
[Key]
public int ProductID { get; set; }
[Required]
public string ProductName { get; set; } = string.Empty;
[ForeignKey("Supplier")]
public int SupplierID { get; set; }
public Suppliers Supplier { get; set; }
[ForeignKey("Category")]
public int CategoryID { get; set; }
public Categories Category { get; set; }
public string? QuantityPerUnit { get; set; }
public decimal UnitPrice { get; set; }
public int UnitsInStock { get; set; }
public int UnitsOnOrder { get; set; }
public int ReorderLevel { get; set; }
public string? Discontinued { get; set; }
}
我的表单只是通过右键单击>添加>控制器>“使用视图,使用实体框架”自动生成的,如下所示:
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="ProductID" />
<div class="form-group">
<label asp-for="ProductName" class="control-label"></label>
<input asp-for="ProductName" class="form-control" />
<span asp-validation-for="ProductName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="SupplierID" class="control-label"></label>
<select asp-for="SupplierID" class="form-control" asp-items="ViewBag.SupplierID"></select>
<span asp-validation-for="SupplierID" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="CategoryID" class="control-label"></label>
<select asp-for="CategoryID" class="form-control" asp-items="ViewBag.CategoryID"></select>
<span asp-validation-for="CategoryID" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="QuantityPerUnit" class="control-label"></label>
<input asp-for="QuantityPerUnit" class="form-control" />
<span asp-validation-for="QuantityPerUnit" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="UnitPrice" class="control-label"></label>
<input asp-for="UnitPrice" class="form-control" />
<span asp-validation-for="UnitPrice" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="UnitsInStock" class="control-label"></label>
<input asp-for="UnitsInStock" class="form-control" />
<span asp-validation-for="UnitsInStock" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="UnitsOnOrder" class="control-label"></label>
<input asp-for="UnitsOnOrder" class="form-control" />
<span asp-validation-for="UnitsOnOrder" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ReorderLevel" class="control-label"></label>
<input asp-for="ReorderLevel" class="form-control" />
<span asp-validation-for="ReorderLevel" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Discontinued" class="control-label"></label>
<input asp-for="Discontinued" class="form-control" />
<span asp-validation-for="Discontinued" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
但是当发布供应商和类别时,调试器中都会有一个
ValidationState = invalid
。我的预感是我错误地构建了模型,但我希望在这里得到任何帮助。
作为参考,我使用的数据库是 SQLite Northwind 数据库:https://github.com/jpwhite3/northwind-SQLite3。
正如这份文件所说,
.NET 6 之前,新项目不包含 Nullable 元素。 从 .NET 6 开始,新项目包括 在项目文件中启用元素。
在 .NET 6 中,必须要求不可为 null 的属性,否则 ModelState 将无效。
因此,解决该问题最简单的方法是将属性设置为可为空:
[ForeignKey("Supplier")]
public int SupplierID { get; set; }
public Suppliers? Supplier { get; set; } // Nullable
[ForeignKey("Category")]
public int CategoryID { get; set; }
public Categories? Category { get; set; } // Nullable
或者从 csproj 文件中删除
<Nullable>enable</Nullable>
。