虽然您可以提供客户端验证作为对用户的好处,但您应该始终(always!) 在服务器上重新验证。用户很容易禁用 javascript 或以其他方式伪造无效的 POST 到您的控制器操作,如果您不检查服务器端的内容,您就会为用户创建破坏系统中数据的机会。
幸运的是,ASP.NET MVC 中的大多数验证都已经为您完成了。如果您的控制器操作如下所示:
public ActionResult SaveSomething(Something thing)
{
if(!ModelState.IsValid)
{
return View("EditSomething", thing);
}
// otherwise, save something...
}
...然后您将发现用户提供的值无法绑定到您的数据属性的问题,以及由属性验证的内容,例如[Required]
and [StringLength(x)]
。但是,某些形式的验证不会自动为您检查。[Remote]
是其中之一。
如果你有一个[Remote]
指向控制器操作的属性,如下所示:
public ActionResult CheckThingCodeValidity(string code)
{
return Json(_thingCodeChecker.ThingCodeWorks(code), JsonRequestBehavior.AllowGet);
}
...那么您的提交操作中也应该有类似的内容:
public ActionResult SaveSomething(Something thing)
{
if(!_thingCodeChecker.ThingCodeWorks(thing.Code))
{
ModelState.AddModelError("Code", "This code is not valid.");
}
if(!ModelState.IsValid)
{
return View("EditSomething", thing);
}
// otherwise, save something...
}
这样,您的标准服务器端验证技术就可以将视图发送回用户,并为他们提供有关该属性的错误消息,以指示他们需要修复的内容。
如果您这样做,那么您不必担心提交表单时异步验证检查是否仍在进行中。如果您的客户端验证通常因缺陷、网络问题或恶意用户干预而失败,也没关系。您仍然会阻止他们提交无效的内容,并且他们仍然会得到一个很好的视图,告诉他们为什么提交无效。