使用DisplayFor模板显示时将模型绑定回来

时间:2010-10-21 12:07:08

标签: c# asp.net-mvc asp.net-mvc-2 viewmodel model-binding

我有模特

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请求绑定回来?或者我还能做些什么来绑回来?

感谢

3 个答案:

答案 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(....)