if(ModelState.IsValid) 不适用于 FormsCollection。用什么代替?

问题描述 投票:0回答:2

要验证绑定到具体类型的 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

附注一千个道歉,我知道这是一个愚蠢的问题

asp.net-mvc-2 validation
2个回答
3
投票

这很正常。你需要

UpdateModel
:

public ActionResult Create()
{
    var model = new MyModelType();
    UpdateModel(model);
    if(ModelState.IsValid) 
    {
        ...
    }
    ...
}

在第一种情况下,调用默认模型绑定器,因为它需要从请求绑定您的模型。然后,此默认模型绑定器将根据您的数据注释规则执行验证。在第二种情况下,您什么也不做。控制器操作不了解您的模型及其用于验证的数据注释。因此模型状态将始终有效,因为没有任何因素会使其无效。

话虽如此,您应该始终使用第一种方法。

FormCollection
根本没用。即使您采用第二种方法(我完全不会推荐),因为您可以看到您不需要任何 FormCollection。


0
投票

如果您使用

FormCollection
手动填充模型,请确保显式触发模型验证。您可以使用
TryValidateModel
方法来实现此目的:

示例:

var model = new YourModelType {
    Firstname = FormCollection[nameof(YourModelType.FirstName)]
};
TryValidateModel(model);
if(!ModelState.IsValid) {
 // ... error
}
   
© www.soinside.com 2019 - 2024. All rights reserved.