我正在查看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;}
}
并传递它,在这种情况下,显然整个事情将是模型。但我们需要这样做吗?为什么或为什么不,以及模型绑定器如何确定需要检查的内容?
答案 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。