Частичное представление с параметризованным префиксом для имен элементов управления
-
11-09-2019 - |
Вопрос
У меня есть 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, который может генерировать префиксы для имен элементов управления?
Решение
просто создайте класс 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.Все на странице ASP.NET MVC будет передано для управления HTML, поэтому не различает контроль в <% html.renderPartial («Bareditor», ViewData ["bar"]);%> и <% html.renderPartial ("bareditor", viewData ["baz"]);%>