Asp.net mvc 对于具有多个参数的动作,模型绑定器是如何工作的

Asp.net mvc 对于具有多个参数的动作,模型绑定器是如何工作的,asp.net-mvc,model-binding,Asp.net Mvc,Model Binding,我在看ASP.NET MVC控制器中的一个动作,看起来像这样: public ActionResult SomeAction( SomeClass sc, OtherClass oc ) { if( ModelState.IsValid ) { ... // do things } return View(); } 我开始怀疑ModelState.IsValid到底在检查什么。换句话说,假设存在多个参数,那么模型是什么?它是验证第一个参数sc中

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

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;}

}

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

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

我设置了一个测试,用于这些模型:

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>
@model SimpleFormModel
@{
ViewBag.Title=“多参数”;
}
多参数




更新
不管怎样,字符串在表单中显示为“模型无效”,因为我没有为
AdditionalFormModel
提供所需的属性。因此,是的,模型绑定器正在检查这两个类的有效性,即使它有一个
AdditionalFormModel
应该包括在内的唯一指示是该类在操作的参数列表中的存在

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


如果能看到一个对导致这种行为的过程有一定了解的答案,那还是很好的,但这回答了它是否同时检查了两者。

想详细说明一下吗?我不明白我要详细说明的内容。只需将一些数据发布到您的服务器,并查看它是否如您所期望的那样工作。根据我的经验,我可以告诉你,当你发布数据时,它会验证它们,它会验证类,所以你发布的所有相关类都会被评估,即使你有一个包含类数组的类。它将验证类数组中的每个元素。通过url传入的int是什么?这似乎对我不起作用。这不是在验证模型你的评论是个问题,是的。以上是一个不完整的答案,明确指出了遗漏的内容。你发布的答案只是表明你对你的问题没有一个清晰的概念。这就是为什么我要你试试,因为STACKOVERFLOW.COM就是这样工作的,你试试,然后问。读一读这里,你将来会有更好的答案。事实上,我很确定你是那个不清楚我的问题是什么的人。我读过关于页面的内容,没有任何内容与这个问题或答案有任何冲突。你的评论毫无用处,而且开始变得无礼。请不要发表更多不必要的评论。我确实尝试过,但在一个大项目中。在没有得到合适的答案后,我做了一个对照实验,并将结果作为部分答案发布。如果没有人愿意解释,那么在某个时候,我会接受我的答案,即使答案不完整。我只是想帮你,活页夹会检查所有内容,这就是你需要知道的,它会验证每个类,即使它们是嵌套的,仅此而已,这里没有更多的解释。