Частичное представление с параметризованным префиксом для имен элементов управления - PullRequest
2 голосов
/ 05 июня 2009

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

Ответы [ 4 ]

2 голосов
/ 20 января 2010

просто создайте класс 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>

НТН

0 голосов
/ 21 декабря 2009

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

0 голосов
/ 20 января 2010

Почему бы не создать модель для вида? Тогда ваше представление должно быть строго типизированным с использованием класса данных 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;
}
0 голосов
/ 05 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...