要验证绑定到具体类型的 HttpPost 操作,我可以使用 ModelState.IsValid
public ActionResult Create(MyModelType myModel)
{
if(ModelState.IsValid)
{
// Do some stuff
return RedirectToAction("Details", 0);
}
else
{
return View();
}
}
这显然不适用于
FormCollection
,因为没有模型可供验证
public ActionResult Create(FormCollection collection)
{
if(ModelState.IsValid) // Never invalid
{
当操作接受
ModelState.IsValid
时,应该使用什么来代替 FormCollection
?
附注一千个道歉,我知道这是一个愚蠢的问题
这很正常。你需要
UpdateModel
:
public ActionResult Create()
{
var model = new MyModelType();
UpdateModel(model);
if(ModelState.IsValid)
{
...
}
...
}
在第一种情况下,调用默认模型绑定器,因为它需要从请求绑定您的模型。然后,此默认模型绑定器将根据您的数据注释规则执行验证。在第二种情况下,您什么也不做。控制器操作不了解您的模型及其用于验证的数据注释。因此模型状态将始终有效,因为没有任何因素会使其无效。
话虽如此,您应该始终使用第一种方法。
FormCollection
根本没用。即使您采用第二种方法(我完全不会推荐),因为您可以看到您不需要任何 FormCollection。
如果您使用
FormCollection
手动填充模型,请确保显式触发模型验证。您可以使用 TryValidateModel
方法来实现此目的:
示例:
var model = new YourModelType {
Firstname = FormCollection[nameof(YourModelType.FirstName)]
};
TryValidateModel(model);
if(!ModelState.IsValid) {
// ... error
}