【问题标题】:More than one Http.RenderAction() in a single View单个视图中的多个 Http.RenderAction()
【发布时间】:2009-11-26 17:26:26
【问题描述】:

众所周知,RenderAction() 属于:

  • Asp.net MVC 1 期货或
  • Asp.net MVC 2 Beta 2

并允许我们在另一个视图或部分视图中呈现动作结果。

说明

  1. 您有一个使用RenderAction() 助手显示的包含多个部分视图的视图。
  2. 至少两个部分视图可能通过使用 Html.BeginForm() 将 <form> 回发到原始视图。
  3. 回发不通过 Ajax 调用执行
  4. 在表单 POST 时验证回发数据。

问题

当其中一个表单被回发时,另一个表单呈现为无效。

有人用过这个模式并解决了吗?我们应该知道是哪个form 执行了回发,并且只有那个人应该验证它的 POST 数据。其他人应该忽略验证或执行常规的HttpVerb.Get 操作处理。

【问题讨论】:

    标签: asp.net-mvc renderaction


    【解决方案1】:

    在表单中有一个隐藏字段来指示是哪一个。或者,将前缀传递给部分并附加到表单中的每个元素。

    关于前缀。第一种方法是有两个属性,调用 Html.RenderPartial("partial", Model.Data1/2.WithPrefix("data1"))。

    public class FormModel
    {
       public string Prefix { get; set; }
    }
    
    public class FormData
    {
       public FormModel Data1 { get; set; }
       public FormModel Data2 { get; set; }
    }
    
    public ActionResult HandlePost(FormData data)
    {
       if (data.Data1 != null) {} else {}
    }
    

    第二种方式相同,但使用两个动作参数。

    public ActionResult HandlePost(FormModel data1, FormModel data2)
    {
       if (data1 != null) {} else {}
    }
    

    在你做的局部视图中

    <%= Html.TextBox(Model.Prefix + ".FormModelField", Model.FormModelField) %>
    

    即你用模型传入的前缀设置字段名。

    当然,您可以在细节上有所不同。

    【讨论】:

    • 我理解关于隐藏字段的第一部分,但我不理解第二个建议。附加到元素 ID 或在哪里?你能改写一下吗?
    • 添加前缀可能意味着我必须创建自己的模型绑定器来识别我的字段并按预期将它们绑定到操作参数?
    • 无论如何。我确实走了 hidden field 路线。它不会更改我的 URL,我可以使其尽可能透明。我编写了另一个扩展方法BeginSubForm(),它在开头呈现一个额外的隐藏字段,用于标识执行回发的特定表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多