我无法弄清楚为什么我的模型的 Id 属性未被模型状态验证。
这在“创建”操作中会发生,其中 ID 不会从视图返回到模型,因为它只是即将生成。
自下而言,底线是理想的结果,因为验证缺少 Id 只会导致问题,但我找不到任何可以告诉模型状态跳过的说明这个属性,我渴望更好地理解它,以便以后重用。
我还要补充一点,这个模型的所有属性都标记为必需。
编辑: 指示的副本指出了另一个问题。
我在这里指出的是,ID属性根本不进行验证,而不是它通过验证的事实。请参阅附带屏幕截图中的modelstate弹出框,模型状态根本不会查看Id属性。
屏幕截图控制器是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Id,Name,ClientName")] Project project)
{
if (ModelState.IsValid)
{
//db.Entry(project).State = EntityState.Modified;
db.MarkAsModified(project);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(project);
我的模特是这样的:
public class Project
{
[Required]
public int Id { get; set; }
[Required]
[Display(Name = "Project name")]
public string Name { get; set; }
[Required]
public string ClientName { get; set; }
}
返回用户输入的视图是:
@model Freelancer_DeveloperChallenge.Models.Project
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Project</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ClientName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.ClientName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ClientName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
答案 0 :(得分:1)
这是预期的结果,原因如下:
您的Id字段是不可为空的int。
您知道的非可空int的默认值为0.
根据Microsoft文档:
RequiredAttribute属性指定在验证表单上的字段时,该字段必须包含值。如果属性为null,包含空字符串(&#34;&#34;)或仅包含空格字符,则会引发验证异常。
编辑: 以下是Microsoft的文档中的其他信息,以回答您在评论中发布的问题:
模型状态表示提交的HTML表单值中的验证错误。
模型验证发生在每个控制器操作被调用之前,操作方法负责检查ModelState.IsValid并做出适当的反应。在许多情况下,适当的反应是返回某种错误响应,理想情况下详细说明模型验证失败的原因。
来源:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation
正如文档中提到的那样:
只有您的表单提交的值才会被验证(我们没有从您的表单中提交ID,即使它已经通过验证,因为它是一个不可为空的int。)
在调用每个控制器操作之前进行模型验证。