当 HttpGet
处理 Create
操作方法仅返回 View()
时,会导致所有表单字段未初始化。
为什么当用户查看空白表单时,JavaScript 验证不会被触发?
最佳答案
我不太清楚内部运作原理,但我会猜测;-)
首先,它与它是 [HttpGet]
还是 [HttpPost]
无关——这只是它通常的工作方式。
您的平均 [HttpGet]
方法如下所示:
[HttpGet]
public ActionResult Index() {
// Get some data from the database
return View(data);
}
此方法中没有任何参数,因为我们希望用户在只需输入 URL(即 Home/Index
)时即可点击此 Controller 。
您常用的[HttpPost]
方法可能如下所示:
[HttpPost]
public ActionResult Create(MyModel myModel) {
if (ModelState.IsValid)
{
// Do stuff
}
else
{
return View(myModel);
}
}
我相信只有当您实际将表单值绑定(bind)到模型并点击 Create(...) Controller 时,验证属性才会被触发。如果您的 [HttpGet]
碰巧接受模型作为参数,那么验证也会在此时触发。
当您使用现有的无效模型返回 View 时,ValidationMessageFor(m => m.SomeProperty)
方法会以某种方式知道该属性的验证失败。这是我不确定的部分。
相比之下,当您返回一个新的 View()
作为 ActionResult(就像您通常对 HTTP GET 所做的那样)时,就会实例化一个全新的、 Shiny 的模型。创建新模型就像创建 POCO(普通旧 C# 对象)一样简单 - 不会触发验证。
至于客户端验证,一旦您单击表单的提交按钮,就完全通过 JavaScript 进行处理。当您的 [HttpGet]
请求显示空白表单时,尚未单击提交按钮(因此 JavaScript 验证尚未启动)。此外,我相信一旦您开始输入,验证也会通过各种 JavaScript 事件启动,例如 change
、keydown
、keypress
等。
关于asp.net - 当 `HttpGet` 处理 `Create` 操作方法仅返回 `View()` 时,为什么浏览器上没有触发 JavaScript 验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495485/