ModelState.IsValid忽略MVC中非可空属性的验证

时间:2017-07-21 13:55:07

标签: c# .net asp.net-mvc validation

我无法弄清楚为什么我的模型的 Id 属性未被模型状态验证。

这在“创建”操作中会发生,其中 ID 不会从视图返回到模型,因为它只是即将生成。

自下而言,底线是理想的结果,因为验证缺少 Id 只会导致问题,但我找不到任何可以告诉模型状态跳过的说明这个属性,我渴望更好地理解它,以便以后重用。

我还要补充一点,这个模型的所有属性都标记为必需。

编辑: 指示的副本指出了另一个问题。

我在这里指出的是,ID属性根本不进行验证,而不是它通过验证的事实。请参阅附带屏幕截图中的modelstate弹出框,模型状态根本不会查看Id属性。

以下是调试时的样子: enter image description here

屏幕截图控制器是:

[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")
}

1 个答案:

答案 0 :(得分:1)

这是预期的结果,原因如下:

  • 您的Id字段是不可为空的int。

  • 您知道的非可空int的默认值为0.

  • 根据Microsoft文档:

  

RequiredAttribute属性指定在验证表单上的字段时,该字段必须包含值。如果属性为null,包含空字符串(&#34;&#34;)或仅包含空格字符,则会引发验证异常。

来源:https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx

编辑: 以下是Microsoft的文档中的其他信息,以回答您在评论中发布的问题:

  

模型状态表示提交的HTML表单值中的验证错误。

     

模型验证发生在每个控制器操作被调用之前,操作方法负责检查ModelState.IsValid并做出适当的反应。在许多情况下,适当的反应是返回某种错误响应,理想情况下详细说明模型验证失败的原因。

来源:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation

正如文档中提到的那样:

  • 只有您的表单提交的值才会被验证(我们没有从您的表单中提交ID,即使它已经通过验证,因为它是一个不可为空的int。)

  • 在调用每个控制器操作之前进行模型验证。