Частичный просмотр с параметризованным префиксом для имен элементов управления

У меня есть 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, который может генерировать префиксы для имен элементов управления?

Ответ 1

просто создайте класс ViewModel для вашего BarEditor и сделайте его строго типированным для этого нового класса

например.

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>

HTH

Ответ 2

Я бы передал строку ( "baz" или "bar" и т.д.) с моей ViewData при вызове пользовательского элемента управления. Пусть html.textbox получит свое имя из переданного текста и его значение из переданного значения.

Ответ 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;
}

Ответ 4

Вам нужно узнать о сопоставлении моделей в ASP.Net MVC. Все на странице asp.net mvc будет отображаться в html-контроле, поэтому не следует различать элементы управления в   <% Html.RenderPartial( "BarEditor", ViewData [ "bar" ]); % > а также   <% Html.RenderPartial( "BarEditor", ViewData [ "baz" ]); % >