2009-03-12 2 views
1

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

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

ответ

1

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

защищен недействительным Application_AuthenticateRequest (объект отправителя, EventArgs е)

0

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

+0

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

1

Это старый вопрос, так что только для будущих посетителей это можно сделать, создав базовый контроллер, унаследованный от контроллера, и обработчик 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). К сожалению, это не глобальное решение, так как смену modelbinder не вызывается, если нет привязки.

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

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