【问题标题】:Partial View with parametrized prefix for controls names带有参数化前缀的控件名称的局部视图
【发布时间】:2009-06-05 11:15:59
【问题描述】:

我有一个 BarEditor.ascx,可以从不同的地方调用。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.Bar>" %>
<%= Html.TextBox("a") %>
...

现在考虑我需要在一个页面 Edit.aspx 上编辑两个对象

    <form action="update">
        <div>
            <% Html.RenderPartial("BarEditor", ViewData["bar"]); %>
        </div>
        <div>
            <% Html.RenderPartial("BarEditor", ViewData["baz"]); %>
        </div>

        <input type="submit" value="Submit" />
    </form>

这提交:

a=1&a=2

我需要它:

bar.a=1&baz.a=2

所以我们可以处理它

public ActionResult Update(Bar bar, Bar baz)
{
    ...
}

编写可以为控件名称生成前缀的可重用 BarEditor.ascx 的最佳方法是什么?

【问题讨论】:

    标签: asp.net-mvc partial-views


    【解决方案1】:

    只需为您的 BarEditor 创建一个 ViewModel 类,并将其强类型化到这个新类中

    例如

    namespace ViewModel {
        public class BarEditor {
    
            string Prefix { get; set; }
            Models.Bar Bar { get; set; }
        }
    }
    

    现在您可以像这样在 BarEditor.ascx 中创建文本框

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

    在您看来,您像这样包含 BarEditor

     <form action="update">
        <div>
            <% Html.RenderPartial("BarEditor", new ViewModel.BarEditor { Prefix = "Bar", Bar = ViewData["bar"]}); %>
        </div>
        <div>
            <% Html.RenderPartial("BarEditor", new ViewModel.BarEditor { Prefix = "Baz", Bar = ViewData["baz"]}); %>
        </div>
        <input type="submit" value="Submit" />
     </form>
    

    【讨论】:

    • 是的,看起来像这样的事情是一种方法。它也可以是自定义的 RenderPartial 实现。让我们将此视为答案:-)
    【解决方案2】:

    在调用用户控件时,我会通过我的 ViewData 传递一个字符串(“baz”或“bar”等)。让 html.textbox 从传递的文本中获取其名称,并从传递的值中获取其值。

    【讨论】:

    • 让我更具体地说...控件可以接受一个简单的类 (textboxdata{}),它有两个属性:textboxName、textboxValue。在调用 RenderPartial 之前,先实例化对象,然后将其传递给控件。您可以在控制器中创建“textboxData”对象的可枚举列表,以避免在视图中发生此类操作。
    【解决方案3】:

    为什么不为视图创建一个模型?然后,您的视图需要是使用数据类 FormView 的强类型视图。

    public class FormView
    {
        string Bar {get; set;}
        string Baz {get; set;}
    }
    

    那么在你看来你可以使用

    <form action="update">
        <div>
            <% Html.RenderPartial("BarEditor", Model.Bar); %>
        </div>
        <div>
            <% Html.RenderPartial("BarEditor", Model.Baz); %>
        </div>
    
        <input type="submit" value="Submit" />
    </form>
    

    你的控制器变成

    public ActionResult Update(FormView MyForm)
    {
        ... = MyForm.Bar;
    
        ... = MyForm.Baz;
    }
    

    【讨论】:

    • 1.为什么在您的示例中 FormView.Bar 和 FormView.Baz 是字符串类型的? 2. 你的建议不起作用。我们将得到 a=1&a=2。
    • 您可以将其更改为 BarEditor 而不是字符串。我几乎在所有项目中都这样做,但我从来没有得到 a=1&a=2。
    • 可能你在谈论一些类似的场景,例如:, .但请注意,我说的是 RenderPartial。顺便说一句,我认为不编写自定义 RenderPartial 就没有解决方案。
    • -1 这根本没有解决问题。问题是如何更改局部视图,使字段名称呈现为“Bar.a”与“Baz.a”,这不取决于您传递的对象来自何处......
    【解决方案4】:

    您应该了解 ASP.Net MVC 中的模型映射。 asp.net mvc 页面中的所有内容都将呈现为 html 控件,因此不区分中的控件 和

    【讨论】:

    • - OP 显然了解模型映射的工作原理,这就是为什么他要求解决他的问题的原因。你没有解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多