我有模特
public class PersonViewModel
{
public Guid Id { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}
嵌套在其他视图模型中:
public class ApprovalModel
{
[UIHint("MyDisplayTemplate")]
public PersonViewModel User { get; set; }
[Required]
public bool? Approve { get; set; }
}
在视图下 - >共享 - > DisplayTemplates我有模板MyDisplayTemplate.ascx
在我的视图ApprovalModel视图中,我使用以下行显示嵌套模型:
<div class="display-field"> <%: Html.DisplayFor(model => model.User) %> </div>
在我的控制器中我有动作
[HttpPost]
public virtual ActionResult ApproveRequest(ApprovalModel vm)
{
//access bound vm.User here
}
是否有一种简单的方法可以将嵌套模型与post请求绑定回来?或者我还能做些什么来绑回来?
感谢
答案 0 :(得分:2)
您需要显示模板中的输入字段:
<%: Html.HiddenFor(x => x.Id) %>
<%: Html.LabelFor(x => x.Firstname) %>
<%: Html.TextBoxFor(x => x.Firstname) %>
<br/>
<%: Html.LabelFor(x => x.Lastname) %>
<%: Html.TextBoxFor(x => x.Lastname) %>
在您的控制器操作中指示用户前缀,以便模型绑定器能够正确识别请求值并将它们绑定到ApprovalModel
。
[HttpPost]
public ActionResult ApproveRequest([Bind(Prefix = "User")] ApprovalModel vm)
此外,编辑器模板似乎更适合(<%: Html.EditorFor(model => model.User) %>
)生成表单和输入字段而不是显示模板。
答案 1 :(得分:2)
在Session中保存视图模型,并将id作为隐藏字段呈现。然后你的post动作可以从Session中检索模型,或者如果它不存在则通过id加载它。
查看:强>
<%: Html.HiddenFor(x => x.Id) %>
<强>控制器:强>
[HttpPost]
public virtual ActionResult ApproveRequest(int id)
{
//access bound vm.User here
}
答案 2 :(得分:1)
您不需要将文件放在文本框中,只需将其放在某些输入字段中,因此当页面回发时,这些值会被发送回服务器。因此,只需对要在回发后恢复的每个字段使用HiddenFor(....)