在“嵌入式​​资源”视图中将“内容”视图用作EditorFor模板

时间:2013-08-01 15:10:49

标签: c#-4.0 asp.net-mvc-4 model-binding

我有一个“嵌入式资源”视图。在此视图中,我使用以下模型

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

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。我仍然不知道为什么会抛出错误,但至少我修复了模型绑定。

模型绑定的问题在于,当您调用@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属性的值。

可能有一个更好的解决方案,但到目前为止,这是最好的,我已经提出。