Частичный просмотр с параметризованным префиксом для имен элементов управления
У меня есть 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" ]); % >