ASP.Net MVC ViewUserControl с контроллером, использующим MVC 1.0 - PullRequest
4 голосов
/ 03 апреля 2009

Из-за путаницы между всей информацией о mvc из всех предварительных выпусков и одним официальным выпуском я очень запутался, как обращаться с viewusercontrols. Итак, раз и навсегда, скажите мне, как реализовать этот пример:

У меня есть список предстоящих событий, которые необходимо отобразить на нескольких страницах моего сайта. Поэтому я поместил новый ViewUserControl (ListEvents.ascx) в мою папку Views \ Shared.

Я запрашиваю этот ListEvents.ascx для рендеринга в моем представлении Home / Index следующим образом:

<p>
    Here's a list of events:
    <% Html.RenderPartial("ListEvents");%>
</p>

Как мне передать мою модель этому viewusercontrol? Я знаю, что могу сделать это:

<p>
    Here's a list of events:
    <% Html.RenderPartial("ListEvents", (new Model.Services.EventService(null)).ListEvents());%>
</p>

Но это не очень умная вещь, создавать новую модель изнутри вида ?! Или я здесь не прав? Я даже не могу передать ни одно состояние проверки, следовательно, нулевой параметр. Поэтому альтернативным вариантом является сохранение этих данных в элементе ViewData [], но мой viewusercontrol не должен зависеть от ViewData его родителя!

Я уверен, что есть очень простой ответ на этот вопрос, пожалуйста, поделитесь, как я закончил просматривать веб-страницы для этой проблемы.

Спасибо!

Простой ответ : Viewusercontrol всегда должен получать свою модель из представления, в котором он находится. Обход этого, например, путем добавления файла codebehind в viewusercontrol, приведет к нарушению шаблона MVC.

1 Ответ

2 голосов
/ 03 апреля 2009

По умолчанию будет использоваться та же модель, что и на странице. Если вы хотите предоставить модель для каждого экземпляра RenderPartial, ваша ситуация, вероятно, похожа на отображение нескольких записей в приложении блога. Вы можете получить каждую модель из коллекции в вашей модели страницы и передать ее в пользовательский элемент управления следующим образом:

foreach (var post in Model.Entries) {
  Html.RenderPartial("PostTemplate", post);
}
...