ASP.NET MVC 3 макет данных ViewBag для всех дочерних представлений - PullRequest
10 голосов
/ 06 марта 2011

Нам нужны динамические данные, передаваемые в наш файл макета, независимо от того, что является дочерним видом Например, мы отображаем некоторые пользовательские данные в заголовке макета.

Как мы можем передать эти данные в представление компоновки, чтобы каждое действие не предоставляло их независимо? Должны ли мы использовать пользовательский контроллер или есть лучшее решение?

Ответы [ 4 ]

9 голосов
/ 06 марта 2011

Стратегия, которую я использую, заключается в том, чтобы иметь модель базового вида, из которой вытекают все мои модели видов.Я использую базовый контроллер, хотя вы также можете использовать глобальный фильтр и переопределить OnActionExecuted.Когда я обнаруживаю действие, которое возвращает ViewResult, я преобразую модель в модель базового вида и устанавливаю общие свойства модели из базового контроллера.

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

Вы также можете сделать то же самое с ViewBag, если вы не хотите получать из модели общего вида.Мне нравится иметь строго типизированную модель, но YMMV.

7 голосов
/ 17 марта 2011

Вы можете использовать @ Html.Action ("ActionName", "ControllerName") в файле _layout.

Вот статья об этом: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

2 голосов
/ 06 марта 2011

Взгляните на элементы управления входом, которые являются стандартными в проекте Razor - эти частичные представления обращаются к данным пользователя - вероятно, точно так, как вы хотели бы.

например. типичный файл LogonPartial.cshtml может содержать:

@if(Request.IsAuthenticated) {
    <text>Welcome <b>@Context.User.Identity.Name</b>!
    [ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
else {
    @:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}
1 голос
/ 08 декабря 2011

Я полагаю, что ядро ​​ваших проблем лучше всего использовать с помощью разделов.

http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

Вы можете определить разделы и затем обновить их с помощью

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