2009-08-22 3 views
1

Как я могу предоставить объект пользователя для каждого представления в ASP.NET MVC без необходимости создания ViewModel для абсолютно каждого вида, который у меня есть?Предоставить объект пользователя для каждого вида

При использовании членства в ASP.NET я просто получаю переменную профиля в представлениях с информацией о профиле, но при сворачивании самостоятельно я не вижу способа экспортировать эту информацию.

ответ

2

Наследуйте контроллеры от базового контроллера. В базовом контроллере переопределите OnActionExecuting и установите ViewData["UserObject"] здесь. Что-то вроде этого:

public class YourBaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["UserObject"] = ... 
    } 
} 

Или создать пользовательский фильтр с таким же OnActionExecuting методом, если вы хотите только определенные контроллеры, обеспечивающие пользовательский объект для просмотра.

ОБНОВЛЕНО:

Создание пользовательских Html помощник, если вы не хотите, чтобы бросить ViewData["UserObject"] каждый раз:

public static object RenderUserObject(this HtmlHelper html) 
{ 
    return ((html.ViewData["UserObject"] as UserObject) ?? new UserObject()).ToString(); 
} 
+0

Разве я не должен бросать каждый раз, когда хочу использовать ViewData ["UserObject"]? – Pablo

+0

Я обновил свой ответ –

0

Наследуйте свои ViewModel классы от мастера ViewModel с User.

В качестве альтернативы вы можете передать объект в коллекции ViewData и использовать метод расширения, чтобы упростить доступ к объекту в представлении.

+1

Мне все равно придется иметь ViewModels для всех видов, во многих случаях я могу просто использовать модель, во многих мне не нужна какая-либо модель вообще. – Pablo

+0

Использование ViewData по-прежнему требует, чтобы каждое действие моего сайта получало данные профиля и помещало его туда, имея много повторений и много кастинга в представлении, что ужасно. – Pablo

+0

Просмотр бросков по методу расширения по-прежнему учитывается при просмотре, но диспетчер должен будет отображать каждое действие. –

0

Одной из альтернатив, имеющих базовый ViewModel класс, и поэтому иметь для определения класса ViewModel для каждого представления, заключается в создании общего класса ViewModel<T>, который предоставляет свойство T InnerModel или что-то подобное. Затем вы можете передать ViewModel<Foo> вместо того, чтобы явно создать класс FooViewModel.

Конечно, если вам также нужны дополнительные модели ViewModels на заказ, вы можете сохранить базовый класс ViewModel и иметь ViewModel<T>, и ваши модели ViewModels на заказ продлевают его.

Смежные вопросы