Asp.net mvc 使用复杂对象通过Html.BeginForm()发布到控制器
Q的标题说明了一切,我读过很多帖子,但仍然无法理解这一点。我要做的就是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 }
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;i确保发布的数据在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”循环会解决问题?值仍然为空-有什么建议吗?@TezWingfieldfor
循环是为了获取项目的索引。检查modelState是否存在错误。