Как получить экземпляр HtmlHelper <TModel>для модели в ASP.NET MVC? - PullRequest
6 голосов
/ 30 марта 2010

Допустим, у меня есть индексное представление. Модель, которую я передаю, на самом деле является коллекцией моделей, поэтому свойство Html имеет тип HtmlHelper<List<MyModel>>. Если я хочу вызвать методы расширения (например, Display() или DisplayFor() для отдельных элементов в списке, я думаю, что мне нужно получить HtmlHelper<MyModel>. Но как?

Я попытался использовать конструктор HtmlHelper<TModel>, который выглядит следующим образом:

HtmlHelper<TModel>(ViewContext, IViewDataContainer)

Но мне не повезло с этим. Я не знаю, как получить IViewDataContainer для предмета, и документация по этим вещам очень скудна.

Когда я делаю, по-видимому, происходит много магии ...

return View(List<MyModel>);

... в моем контроллере.

Как воссоздать эту магию для отдельных предметов в списке / коллекции?

Обновление

Вот фрагмент кода, показывающий, что я пытаюсь выполнить:

        foreach(var item in items)
        {
            var helper = new HtmlHelper<ProjName.MyModel>(ViewContext, ????);
%>
            <tr>
<%
                foreach(var property in properties)
                {
%>
                    <td>
                        <%=  helper.Display(property.DisplayName) %>
                    </td>
<%          
                }
%>
            </tr>
<%
        }

По сути, я хочу заполнить ячейки таблицы, используя элементы в коллекции. Мне просто нужна помощь в установке переменной helper.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2010

Одной из идей является использование RenderPartial. Поэтому создайте пользовательский элемент управления, который имеет тип вашей модели (MyModel). Затем на главном экране добавьте следующий код.

<% Html.RenderPartial("SubView", property); %>

Таким образом, основной вид будет выглядеть так:

 foreach(var item in items) 
 { 
    %> 
    <tr> 
    <% 
        foreach(var property in properties) 
        { 
         %> 
            <td> 
                <%= Html.RenderPartial("SubView", property) %> 
            </td> 
        <%           
        } 
        %> 
    </tr> 
    <% 
    }
    %>

Тогда вложенное представление будет строго типизированным пользовательским элементом управления типа. Подвид может просто вызвать помощника, и он будет иметь правильный тип:

<%= Html.Display(Model.DisplayName) %>
1 голос
/ 06 мая 2010
0 голосов
/ 30 марта 2010

Сама страница является IViewDataContainer. Вы можете попробовать это:

foreach(MyModel m in Model)
{
    HtmlHelper helper = new HtmlHelper<MyModel>(ViewContext, this);
    ...
}

UPDATE

Другая идея: вы можете создать ViewUserControl<MyModel> и использовать RenderPartial для визуализации каждого элемента с этим элементом управления. ViewUserControl<MyModel> предоставляет HtmlHelper<MyModel>, который можно использовать для рендеринга модели

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