MS MVC - Могу ли я как-то глобально заполнить строго типизированные ViewData / Model для всех моих видов? - PullRequest
1 голос
/ 12 марта 2009

Я хотел бы предоставить экземпляр зарегистрированного пользователя (или ноль, если никто еще не вошел) для всех представлений в моем приложении MVC. Я уже успешно реализовал свой собственный класс ControllerActionInvoker, который переопределяет InvokeAction и предоставляет зарегистрированный пользовательский экземпляр в ViewData (controllerContext.Controller.ViewData ["LoggedUser"] = xxx). Проблема в том, что я хотел бы использовать строго типизированную модель для передачи зарегистрированного пользовательского экземпляра во всем приложении. Я думал о том, чтобы иметь класс ApplicationViewDataBase, который мог бы быть базовым классом для всех моих строго типизированных классов ViewData и который также предоставил бы зарегистрированный пользовательский экземпляр. Я мог бы легко получить доступ к зарегистрированному экземпляру пользователя во всех моих представлениях.

Можно ли заполнить строго типизированный глобально, как я добился в переопределении ControllerActionInvoker.InvokeAction? Или лучше как-нибудь предоставить мой экземпляр User в Page.User? Я нашел бы, вероятно, более гладким, чтобы использовать Page.User, но также не нашел никакого решения, как внедрить мой пользовательский экземпляр ...

Ответы [ 3 ]

1 голос
/ 14 октября 2015

Это старый вопрос, поэтому для удобства будущих посетителей это можно сделать путем создания basecontroller, унаследованного от Controller, и обработки OnActionExecuted () для добавления пользовательских пользовательских экземпляров в представление между действием контроллера и представлением. Вот полная реализация этого здесь: http://blog.bitdiff.com/2012/05/sharing-common-view-model-data-in.html

Если вы хотите, чтобы эти данные были доступны для вашего метода действия, все немного усложняется, так как представление еще не существует.

Для методов POST "baseView = filterContext.Controller.ViewData.Model as BaseView" предоставит вам доступ к представлению, но вам понадобится настраиваемое связующее для модели для установки ViewData.Model (см. https://stackoverflow.com/a/25250058/2381157). К сожалению, это не так не является глобальным решением, так как связыватель моделей не вызывается, если нет ничего связывающего.

Один подход, который может подойти, - это ActionFilter или AttributeFilter, который вставляет значение в RouteData или ActionParameters, но ваше действие должно будет передать это значение в представление.

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

1 голос
/ 12 марта 2009

Может быть, лучший способ поместить пользователя в HttpContext? В global.asax

Защищено void Application_AuthenticateRequest (отправитель объекта, EventArgs e)

0 голосов
/ 12 марта 2009

Вам не нужно добавлять это; он уже доступен в ASP.NET MVC. Посмотрите на ViewContext.HttpContext.User.Identity.Name

...