Asp.Net MVC 3没有在发布时将集合绑定到模型

时间:2013-01-12 14:51:11

标签: asp.net-mvc-3 razor collections enums model-binding

我有一个具有许多属性的对象,其中一个是一些其他复杂对象的数组 像这样的东西

class obj1
{
 public string prop1 {get; set;}
 public string prop2 {get; set;}
 public obj2[] array {get; set;}
}
class obj2
{
 SomeEnum Type{get; set;}
 string Content{get; set;}
}

我为obj2数组创建了一个编辑器模板,让它命名为obj2ArrayTemplate
这是这样的

@for (int i = 0; i < Model.Length; i++)
{
    @Html.EditorFor(model=>model[i],"obj2Template")
}

和obj2的编辑器模板让它命名为obj2Template
这是这样的

<div class="editor-label">
    @Html.DisplayFor(model=>model.Type,"SomeEnum",ViewData)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Content)
    @Html.ValidationMessageFor(model => model.Content)
</div>

现在因为Type属性SomeEnum属于enum,因此无法由Asp.Net MVC直接呈现 我也为此创建了一个模板 这是这样的事情

<input type="text" value="@Model.ToString()" id="@ViewData.TemplateInfo.HtmlFieldPrefix" name="@ViewData.TemplateInfo.HtmlFieldPrefix"/>

正在正确呈现视图,并且组合的渲染视图的HTML为

<div class="editor-field">
    <input class="text-box single-line" id="array__0__Content" name="array.[0].Content" type="text" value="FBID" />
</div>
<div class="editor-label">
<input type="text" value="Blog" id="array.[1].Type" name="array.[1].Type"/>
</div>
<div class="editor-field">
    <input class="text-box single-line" id="array__1__Content" name="array.[1].Content" type="text" value="SOme random blog" />
</div>
<div class="editor-label">
<input type="text" value="Twitter" id="array.[2].Type" name="array.[2].Type"/>
</div>
<div class="editor-field">
    <input class="text-box single-line" id="array__2__Content" name="array.[2].Content" type="text" value="Twitter Profile" />
</div>

当iam发回包含此html的表单时 chrome正在向我显示此发布的数据

prop1:val1
prop2:val2
array.[0].Type:Facebook
array.[0].Content:FBID
array.[1].Type:Blog
array.[1].Content:SOme random blog
array.[2].Type:Twitter
array.[2].Content:Twitter Profile

但仍然是类型为array of obj2的模型中obj1的数组字段为null

我做错了什么?

1 个答案:

答案 0 :(得分:1)

可以破解那个:) 检查从服务器发布的请求我发现请求中有一个。(点)额外的,因此数组没有被填充
所以而不是

array.[0].Type:Facebook
array.[0].Content:FBID
array.[1].Type:Blog
array.[1].Content:SOme random blog
array.[2].Type:Twitter
array.[2].Content:Twitter Profile

这应该贴回来

array[0].Type:Facebook
array[0].Content:FBID
array[1].Type:Blog
array[1].Content:SOme random blog
array[2].Type:Twitter
array[2].Content:Twitter 

我发现没有明显的理由说明为什么Asp.Net MVC框架会添加额外的点。当我有点做MVC的一切方式时 所以我改变了我的代码以包含一些小黑客。
我把它添加到了obj 2的

的编辑模板中
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = ViewData.TemplateInfo.HtmlFieldPrefix.Replace(".", "");
    }

所以现在一切都运行得很顺利。