框架如何知道ModelState.当表单字段无效时,IsValid '在HTTPGET中必须为true,而在HTTPPO

本文关键字:HTTPGET HTTPPO 而在 true ModelState 何知道 表单 字段 IsValid 无效 框架 | 更新日期: 2023-09-27 18:13:23

考虑如下简单的数据模型Student.cs

class Student
{
    [Required(ErrorMessage="Please enter your name.")]   
    public string Name {get;set;}
    // other properties go here
}

表单视图registration.cshtml如下所示,

<form asp-action="Registration" method="Post">
<p>ModelState.IsVali is @ViewBag.Message</p>
<p>Data: <input asp-for="Name"></p>
<button type="submit">Submit</button>
</form>

和动作方法如下,

[HttpGet]
ViewResult Registration()
{
    ViewBag.Message=ModelState.IsValid;
    return View();
}
[HttpPost]
ViewResult Registration(Student s)
{
    if(!ModelState.IsValid){
       ViewBag.Message=false;
       return View();
    }
}
  • 框架如何知道ModelState.IsValid必须在HTTPGET中为真,但在HTTPPOST中为假,当表单字段无效时?对于我来说,传递给用户的空白视图表单(通过操作方法的HttpGet版本)应该使ModelState.IsValid为假。

  • 额外的问题:为什么我们不需要做return View(s);而不是return View();时返回无效的形式和保留输入的数据字段?对我来说,return View();似乎返回一个空白的形式。

框架如何知道ModelState.当表单字段无效时,IsValid '在HTTPGET中必须为true,而在HTTPPO

当您发出请求(GET或POST)时,DefaultModelBinder从请求中读取值(查询字符串参数,路由值,表单值等),初始化方法中的任何参数,并尝试设置它们的值。

在你的GET方法的情况下,你没有一个模型作为参数,所以没有什么要初始化,也没有什么要设置,所以没有任何东西被添加到ModelStateModelState.IsValid返回true(它只返回false,如果有一个验证错误作为设置模型属性的值的结果)。

对于POST方法,您有一个参数Student s,用于初始化模型的新实例。如果你的文本框是空的,一个ModelState错误将被添加,因为[Required]属性(默认情况下,空字符串意味着null)和ModelState.IsValid将返回false


使用return View();将返回当前视图,而无需将模型传递给视图。使用HtmlHelper方法生成的任何表单控件如果存在,则使用ModelState中的值(如果不存在,则从ViewDataDictionary中读取值,然后从实际模型中读取值),因此,如果您最初发布"xyz",则将Name: "xyz"的键/值对添加到ModelState中。您的@Html.TextBoxFor(m => m.Name)方法在ModelState中找到匹配,文本框的值设置为"xyz"。作为证明,如果在POST方法中使用

s.Name = "Another Value";
return View(s);

您将看到文本框保留了您发布的原始值,而不是"另一个值"

如果你也包括<div>@Model.Name</div>, NullReferenceException将被抛出(因为你不能访问nullName属性),所以你应该总是返回一个模型到视图。