我有一个"嵌入式资源"视图。在这个视图中,我使用以下型号的
public class TestModel
{
public TestModel()
{
CustomModel1 = new CustomModel1 ();
CustomModel2 = new CustomModel2();
}
public CustomModel1 CustomModel1 { get; set; }
public CustomModel2 CustomModel2{ get; set; }
}
在这个视图中,我有一个表单,在其中我使用@Html.EditorFor
而不是@Html.Partial
,因为当我使用@Html.Partial
时,传递给操作(提交表单时)的CustomModel1是空的。
@Html.EditorFor(m => m.CustomModel1, Constants.CustomEmbeddedView1)
然而,当我使用@Html.EditorFor
并将"内容"视图作为模板传递时
@Html.EditorFor(m => m.CustomModel1, "~/Views/Common/_CustomPartialView.cshtml")
我得到以下错误:
传递到字典中的模型项为null,但此字典需要类型为"System.Int32"的非null模型项。
如果我将"内容"视图设置为"嵌入式资源",一切都会正常工作。
有什么办法解决这个问题吗?也许还有另一种解决模型绑定问题的方法,而不是使用@Html.EditorFor
。
我找到了解决问题的方法。我仍然不知道为什么会抛出错误,但至少我修复了模型绑定。
模型绑定的问题是,当您调用@Html.Partial
时
@Html.Partial("~/Views/Common/_CustomPartialView.cshtml", Model.CustomModel1)
被显示的元素(例如,我在局部视图中使用@Html.EditorFor(m => m.Name)
)具有id="Name"
。因此,模型绑定试图在TestModel
中找到一个"Name"属性,但Name属性在CustomModel1
属性中。这就是为什么模型绑定不起作用,并且在提交表单时Name属性为空字符串。
修复方法是设置HtmlFieldPrefix。
var dataDictCustomModel1 = new ViewDataDictionary { TemplateInfo = { HtmlFieldPrefix = "CustomModel1" } };
@Html.Partial("~/Views/Common/_CustomPartialView.cshtml", Model.CustomModel1, dataDictCustomModel1 )
通过这种方式,Name属性的id变为id="CustomModel1_Name"
,从而允许模型绑定器正确设置Name属性的值。
可能有更好的解决方案,但到目前为止,这是我想出的最好的解决方案。