框架如何知道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();
似乎返回一个空白的形式。
当您发出请求(GET或POST)时,DefaultModelBinder
从请求中读取值(查询字符串参数,路由值,表单值等),初始化方法中的任何参数,并尝试设置它们的值。
在你的GET方法的情况下,你没有一个模型作为参数,所以没有什么要初始化,也没有什么要设置,所以没有任何东西被添加到ModelState
和ModelState.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
将被抛出(因为你不能访问null
的Name
属性),所以你应该总是返回一个模型到视图。