Частичное представление с параметризованным префиксом для имен элементов управления
У меня есть 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 ответа
Просто создайте класс 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>
НТН
Я бы передавал строку ("baz" или "bar" и т. Д.) С моими ViewData при вызове пользовательского элемента управления. Пусть html.textbox получит свое имя из переданного текста и его значение из переданного значения.
Почему бы не создать модель для вида? Тогда ваше представление должно быть строго типизированным с использованием класса данных 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;
}
Вы должны узнать о сопоставлении моделей в ASP.Net MVC. Все на странице mvc asp.net будет отображено в элемент управления html, поэтому не различайте элементы управления в <% Html.RenderPartial ("BarEditor", ViewData ["bar"]); %>и <% Html.RenderPartial ("BarEditor", ViewData ["baz"]); %>