ASP.Net MVC ViewUserControl с контроллером, использующим MVC 1.0
-
23-08-2019 - |
Вопрос
Из-за путаницы между всей информацией о mvc из всех предварительных выпусков и одной официальной версии, я очень не понимаю, как обращаться с элементами управления viewuser.Итак, раз и навсегда скажите мне, как реализовать этот пример:
У меня есть список предстоящих событий, который необходимо отобразить на нескольких страницах моего сайта.Поэтому я поместил новый ViewUserControl (ListEvents.ascx) в свою папку Views\Shared.
Я прошу этот ListEvents.ascx отобразить в моем представлении Home/Index следующим образом:
<p>
Here's a list of events:
<% Html.RenderPartial("ListEvents");%>
</p>
Как мне передать мою модель этому элементу управления viewuser?Я знаю, что могу сделать это:
<p>
Here's a list of events:
<% Html.RenderPartial("ListEvents", (new Model.Services.EventService(null)).ListEvents());%>
</p>
Но это не кажется очень умным поступком — создавать новую модель изнутри представления?!Или я здесь ошибаюсь?Я даже не могу передать какое-либо состояние проверки, отсюда и нулевой параметр.Таким образом, альтернативный вариант — сохранить эти данные в элементе ViewData[], но мой элемент управления viewuser не должен зависеть от ViewData своего родителя!
Я уверен, что на этот вопрос есть очень простой ответ, поделитесь, пожалуйста, когда я закончу поиск в Интернете этой проблемы.
Спасибо!
Простой ответ:Пользовательский элемент управления view всегда должен получать свою модель из представления, в котором он находится.Обход этой проблемы, например добавление файла кода программной части в элемент управления viewuser, приведет к нарушению шаблона MVC.
Решение
По умолчанию будет использоваться та же модель, что и страница.Если вы хотите предоставить модель каждому экземпляру RenderPartial
, ваша ситуация, вероятно, аналогична рендерингу нескольких записей в приложении блога.Вы можете получить каждую модель из коллекции в модели страницы и передать ее пользовательскому элементу управления следующим образом:
foreach (var post in Model.Entries) {
Html.RenderPartial("PostTemplate", post);
}