【问题标题】:Bind model back when displayed with DisplayFor template使用 DisplayFor 模板显示时绑定模型
【发布时间】:2011-04-28 14:01:11
【问题描述】:

我有模型

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
}

有没有一种简单的方法可以将嵌套模型与发布请求绑定回来?或者我还能做些什么来绑定它?

谢谢

【问题讨论】:

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


    【解决方案1】:

    您需要在显示模板中输入字段:

    <%: 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)
    

    此外,编辑器模板 (&lt;%: Html.EditorFor(model =&gt; model.User) %&gt;) 似乎更适合生成表单和输入字段,而不是显示模板。

    【讨论】:

    • 但我不想编辑这些字段。我想显示它们并在发布操作中重复使用它们
    • 如果没有输入字段,您将无法在控制器操作中取回值。当您使用ApprovalModel 作为操作参数时,它将查找请求中传递的那些值。如果您不希望这些输入字段可见但需要以某种方式将值发送到服务器,您也可以将它们作为隐藏字段包含在表单中。
    【解决方案2】:

    将您的视图模型保存在 Session 中并将 id 呈现为隐藏字段。然后,您的 post 操作可以从 Session 中检索模型,或者如果它不存在,则通过 id 加载它。

    查看:

    <%: Html.HiddenFor(x => x.Id) %>
    

    控制器:

    [HttpPost]
    public virtual ActionResult ApproveRequest(int id)
    {
        //access bound vm.User  here
    }
    

    【讨论】:

      【解决方案3】:

      您不需要将文件放入文本框中,只需将其放入 一些 输入字段中,这样当页面被回发时,这些值就会被发送回服务器。因此,只需对要在回发时恢复的每个字段使用 HiddenFor(....)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 2012-11-08
        相关资源
        最近更新 更多