Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 使用;内容“;以“编辑器”的形式查看模板;“嵌入式资源”;看法_C# 4.0_Asp.net Mvc 4_Model Binding - Fatal编程技术网

C# 4.0 使用;内容“;以“编辑器”的形式查看模板;“嵌入式资源”;看法

C# 4.0 使用;内容“;以“编辑器”的形式查看模板;“嵌入式资源”;看法,c#-4.0,asp.net-mvc-4,model-binding,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 CustomMode

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

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
并将“内容”视图作为模板传递时

我得到以下错误:

传递到字典中的模型项为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\u Name”
,从而允许模型绑定器正确设置Name属性的值

也许有更好的解决方案,但到目前为止,这是我提出的最好的解决方案

var dataDictCustomModel1 = new ViewDataDictionary { TemplateInfo = { HtmlFieldPrefix = "CustomModel1" } };
@Html.Partial("~/Views/Common/_CustomPartialView.cshtml", Model.CustomModel1, dataDictCustomModel1 )