Asp.Net MVC 3 not binding collections to models on posting

佐手、 提交于 2019-12-25 17:18:28

问题


i have a object with many properties of which one is an array of some other complex object
something like this

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;}
}

I have created an editor template for the array of obj2 lets name it obj2ArrayTemplate
which is like this

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

and an editor template for obj2 lets name It obj2Template
which is like this

<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>

now because property Type if of type SomeEnum which is an enum and hence cannot be rendered directly by the Asp.Net MVC
I have created a Template for this too
which is something like this

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

the view is being rendered correctly and the HTML of the combined rendered view is

<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>

when iam posting back the form containing this html
chrome is showing me this posted data

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

but still array field which is an array of obj2 in the model of type obj1 is null

what am I doing wrong?


回答1:


Could crack that one :)
inspecting the request that was being posted from the server I found out that there is one .(dot) extra in the request so the array is not being populated
so instead of

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

this should be posted back

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 

and I found no apparent reason of why Asp.Net MVC framework is putting in that extra dot. when im kind of doing everything the MVC way
so I changed my code to include a little hack.
I added this like to the Editor template of obj 2

@{
    ViewData.TemplateInfo.HtmlFieldPrefix = ViewData.TemplateInfo.HtmlFieldPrefix.Replace(".", "");
    }

so now everything is running fine and smooth.



来源:https://stackoverflow.com/questions/14294466/asp-net-mvc-3-not-binding-collections-to-models-on-posting

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!