模型绑定器如何为具有多个参数的动作起作用

时间:2014-03-27 22:45:44

标签: asp.net-mvc model-binding

我正在查看ASP.NET MVC控制器中的一个Action,看起来像这样:

public ActionResult SomeAction( SomeClass sc, OtherClass oc ) {

    if( ModelState.IsValid ) {

        ... // do things

    }

    return View();

}

我开始怀疑ModelState.IsValid究竟在检查什么。换句话说,鉴于有多个参数,模型是什么?它是否验证第一个参数sc中的字段,还是查看所有参数中的所有字段,或者是什么?

很明显,人们可以创建一个包装类,例如

public class WholeModel {

    public SomeObject sc {get; set;}
    public OtherClass oc {get; set;}

}

并传递它,在这种情况下,显然整个事情将是模型。但我们需要这样做吗?为什么或为什么不,以及模型绑定器如何确定需要检查的内容?

2 个答案:

答案 0 :(得分:1)

我使用这些模型进行了测试:

public class SimpleFormModel {

    [Required]
    public Guid aGuid { get; set; }

    [Required]
    public String aString { get; set; }

    [Required]
    public int anInt { get; set; }

    public SimpleFormModel( ) {
        this.aGuid = new Guid( "ABCD1234-ABCD-ABCD-ABCD-ABCD1234EF56" );
        this.anInt = 42;
        this.aString = "The string from the base constructor.";
    }
}

public class AdditionalFormModel {
    [Required]
    public string aString2 { get; set; }
    [Required]
    public int anInt2 { get; set; }
}

以及具有此操作的控制器:

public ActionResult MultipleParameters( SimpleFormModel modelOne, AdditionalFormModel modelTwo ) {
    if( !ModelState.IsValid ) {
        modelOne.aString = "The model isn't valid.";
    }

    return View(modelOne);
}

以及此视图:

@model SimpleFormModel

@{
    ViewBag.Title = "MultipleParameters";
}

<h2>MultipleParameters</h2>

<form action="/Home/MultipleParameters" method="post">

    <input name="aGuid" type="text" value="@Model.aGuid"/><br />
    <input name="anInt" type="text" value="@Model.anInt"/><br />
    <input name="aString" type="text" value="@Model.aString"/><br />
    <br />
    <button type="submit">Update</button>

</form>

无论如何,字符串在表单中显示为&#34;模型无效。&#34;,因为我没有为AdditionalFormModel提供所需的属性。所以,是的,模型绑定器正在检查两个类的有效性,即使它应该包含AdditionalFormModel的唯一指示是该类存在于Action的参数列表中。

如果我从[Required]的属性中删除AdditionalFormModel属性,则字符串会更新,模型会被视为有效。或者,我可以为AdditionalFormModel提供一个显式的无参数构造函数,用于初始化每个必需的属性,例如在SimpleFormModel中,并且也可以。

如果能够对导致此行为的过程有所了解,那么看到答案仍然会很好,但这可以回答它是否同时检查。

答案 1 :(得分:0)

它将验证所有参数,即使它们是嵌套的clases。