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

StackOverflow https://stackoverflow.com/questions/955371

  •  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"]);%>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top