【发布时间】:2016-10-17 08:39:29
【问题描述】:
考虑一个简单的数据模型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为 false。额外问题:当返回无效表单并保留输入的数据字段时,为什么我们不需要
return View(s);而不是return View();?对我来说,return View();似乎返回了一个空白表格。
【问题讨论】:
-
你的 GET 方法没有接收到模型(它没有任何参数)所以没有任何东西被添加到
ModelState所以它总是true(在 POST 方法中,你的方法有一个参数对于模型) -
额外问题解释:默认路由引擎配置为在返回空参数视图时遵循动作方法名称。因此,如果您将
return View()提交为ViewResult,默认情况下,路由模式会搜索与声明的操作名称具有相同名称的视图。 -
return View();确实返回一个“空白”(默认实例)模型。如果您在视图中包含<div>@Model.SomeProperty</div>,它将引发异常。表单控件中的值首先从ModelState填充(如果它们存在)(它们确实存在) -
return View();或return View(s);在ModelState.IsValid为 false 的情况下工作相同。 -
我将添加一个简短的答案来解释行为:)
标签: c# asp.net asp.net-mvc