Asp.net mvc 使用复杂对象通过Html.BeginForm()发布到控制器

Asp.net mvc 使用复杂对象通过Html.BeginForm()发布到控制器,asp.net-mvc,Asp.net Mvc,Q的标题说明了一切,我读过很多帖子,但仍然无法理解这一点。我要做的就是Post一个包含嵌套对象的对象。核心对象填充良好,但嵌套对象始终返回null 后端/视图模型本身: public class EntityExtendedProperty { public ExtendedPropertyDefinition Definition { get; set; } //Type above contains Definition.ExtendedPropertyOptions }

Q的标题说明了一切,我读过很多帖子,但仍然无法理解这一点。我要做的就是
Post
一个包含嵌套对象的对象。核心对象填充良好,但嵌套对象始终返回null

后端/视图模型本身:

public class EntityExtendedProperty
{
    public ExtendedPropertyDefinition Definition { get; set; }
    //Type above contains Definition.ExtendedPropertyOptions
}
控制员:

public ActionResult EditExtendedProperty(EntityExtendedProperty vm)
{
    //Can I access View Model here?
    var v = vm; // I debug here
}
前端:

@using (Html.BeginForm("EditExtendedProperty","Organisation",FormMethod.Post, new {vm = Model }))
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(m => Model.Definition.Id)

    <div class="form-horizontal">
        <h4>Edit Extended Property</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <table border="1" cellpadding="10">
                    <tr>
                        <td>Area :</td>
                        <td>@Model.Definition.ExtendedPropertyEntityType.Name</td>
                    </tr>
                    <tr>
                        <td>Title</td>
                        <td>@Html.EditorFor(m => m.Definition.Title)</td>
                    </tr>
                    <tr>
                        <td>IsEnumerated</td>
                        <td>@Html.EditorFor(m => m.Definition.IsEnumerated)</td>
                        @if(Model.Definition.ExtendedPropertyOptions.Any())
                        {
                        <td>
                            <table>
                                <tr><th>Options</th></tr>
                                @foreach(var o in Model.Definition.ExtendedPropertyOptions)
                                {
                                    <tr><td>@Html.EditorFor(m => o.Title)</td></tr>
                                }
                            </table>
                        </td>
                        }   
                    </tr>
                    <tr>
                        <td>AllowMultiSelect</td>
                        <td>@Html.EditorFor(m => m.Definition.AllowMultiSelect)</td>
                    </tr>
                    <tr>
                        <td>IsDate</td>
                        <td>@Html.EditorFor(m => m.Definition.IsDate)</td>
                    </tr>
                </table>
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}
@使用(Html.BeginForm(“EditExtendedProperty”,“organization”,FormMethod.Post,new{vm=Model}))
{
@Html.AntiForgeryToken()
@HiddenFor(m=>Model.Definition.Id)
编辑扩展属性

@Html.ValidationSummary(true,“,new{@class=“text danger”}) 面积: @Model.Definition.ExtendedPropertyEntityType.Name 标题 @EditorFor(m=>m.Definition.Title) 我计算 @EditorFor(m=>m.Definition.IsEnumerated) @if(Model.Definition.ExtendedPropertyOptions.Any()) { 选择权 @foreach(Model.Definition.ExtendedPropertyOptions中的var o) { @EditorFor(m=>o.Title) } } AllowMultiSelect @EditorFor(m=>m.Definition.AllowMultiSelect) 伊斯达 @EditorFor(m=>m.Definition.IsDate) }
正如您所看到的,这都是相对简单的,但是为什么
ExtendedPropertyOptions
值返回空值呢


非常感谢您的帮助

您的编辑器应该如下所示:

@for(var i = 0; i < Model.Definition.ExtendedPropertyOptions.Count; i++)
{
    <tr><td>@Html.EditorFor(m => m.Definition.ExtendedPropertyOptions[i].Title)</td></tr>
}
for(var i=0;im.Definition.ExtendedPropertyOptions[i].Title) }
确保发布的数据在chrome网络标签中看起来是正确的-我认为它应该是

Definition.Title: "Hello"
Definition.ExtendedPropertyOptions[0].Property: "a"
Definition.ExtendedPropertyOptions[1].Property: "b"

您可能需要使用其他方式将html前缀传递给子对象,或者使用该前缀和局部视图来设置TemplateInfo.HtmlFieldPrefix

如果
ExtendedPropertyOptions
si是一个复杂对象,那么它的
EditorFor(m=>m.ExtendedPropertyOptions)
(无循环)然后为该类型创建一个
EditorTemplate
。或者使用
for
循环。非常感谢-我不完全确定为什么更改为“for”循环会解决问题?值仍然为空-有什么建议吗?@TezWingfield
for
循环是为了获取项目的索引。检查modelState是否存在错误。