asp.net mvc частичное представление - PullRequest
0 голосов
/ 20 апреля 2009

Кажется, что мое понимание использования частичных представлений не совсем верно.

Я пытаюсь добавить частичное представление, которое создается из базы данных, и использовать частичное представление на главной странице.

Используя проект NerdDinner (который отлично подходит для mvc), я добавил следующее:

Просмотры \ Shared \ dinners.ascx ":

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<NerdDinner.Models.Dinner>>" %>
<ul>
    <% foreach (var dinner in Model) { %>
        <li>
            <a href="/Dinners/Details/<%=dinner.DinnerID %>"><%= Html.Encode(dinner.Title) %></a> 
        </li>
<% } %>
</ul>

Внутри "Views \ Shared \ Site.Master":

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
...
<% Html.RenderPartial("dinners"); %>

Вышеуказанное в настоящее время будет работать только на тех страницах, где объект dinners в настоящее время доступен в виде списка (например, site / Dinners). Есть ли способ сделать это элегантно и MVC или это то, что требует умного компромисса?

Ответы [ 6 ]

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

Этот учебник на сайте Стефана Вальтера посвящен этой проблеме. Если вы используете абстрактный базовый класс, в котором объект dinners заполнен и наследуется от него, он всегда будет доступен, но вы должны знать, что он всегда есть, даже если он вам не нужен;).

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

Это, IMO, одно из самых больших ограничений ASP.NET MVC - управление общими данными для нескольких представлений (рядом с рендерингом частичных представлений ascx в строки!). Если вы зайдете в Google или поищите в stackoverflow что-то вроде «управления данными общего представления asp.net mvc», вы получите массу результатов с различными вариантами, ни один из которых не является действительно идеальным. Команда MVC в Microsoft признала это проблемой и надеется включить стандартное решение в следующий выпуск.

В зависимости от того, как вы управляете доступом к данным, самым простым способом может быть создание базового класса Controller и извлечение данных, которые вам нужны для частичного, либо внутри конструктора, либо внутри OnActionExecuting ().

Я выбрал опцию - использовать вспомогательный метод Html.RenderAction() внутри проекта MvcContrib. В основном это позволяет вам вызывать метод действия из вашего представления и отображать ответ. Это не очень хорошо, поскольку требует от вашего взгляда еще большего знания контроллеров, но дает простое краткосрочное решение, которое не требует подключения дополнительного кода с вашей стороны.

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

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

1 голос
/ 20 апреля 2009

Один из методов, который я использую, - это создание вспомогательного метода и использование его на главной странице.

public static void RenderDinners(this HtmlHelper helper)
{
    helper.RenderAction<DinnersController>(c => c.Dinners());
}
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
...
<% Html.RenderDinners(); %>

Как видите, помощник вызывает метод Dinners Action в DinnersController.

public ActionResult Dinners()
{
   ...get dinners and put in the View
   return Dinners(view);
}
0 голосов
/ 20 апреля 2009

Я согласен с Дэниелом, даже если ваш элемент управления отображается не на каждой странице, а на некоторых из них, вы должны создать своего мастера как шаблон *

0 голосов
/ 20 апреля 2009

частичное представление кажется мне изначально ошибочным. Он создает соединение модулей и преднамеренно нарушает сцепление по определению.

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