2013-08-30 1 views
3

Я использую модель:В моей главной странице используется модель представления, которую наследуют все мои другие модели, как это упростить?

public void MasterViewModel 
{ 
    public CurrentSession Session {get;set;} 
} 

А потом все остальные мои модели вид выглядеть следующим образом:

public void LoginViewModel : MasterViewModel 
{ 

} 

Проблема в том, что я должен инициализировать мой MasterViewModel в каждом и каждое действие, как это:

public ActionResult Index() 
{ 
    var model = new WelcomeIndexViewModel 
    { 
    Session = this.GetSession(); // from my base controller 
    } 

    .. 
} 

Мой basecontroller имеет метод GetSession()

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

ответ

4

Одна вещь, которую вы могли бы сделать, в вашем BaseController переопределение OnResultExecuting, угон модель представления и ввести Session переменную INT, как это:

public class BaseController : Controller 
{ 
    protected override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var viewResult = filterContext.Result as ViewResult; 
     if (viewResult != null) 
     { 
      var viewModel = viewResult.Model as MasterViewModel; 
      if (viewModel != null) 
      { 
       viewModel.Session = GetSession(); 
      } 
     } 
     base.OnResultExecuting(filterContext); 
    } 
} 

Примечание: Это только проверка, если вы используете return View(model); в контроллере , вы также можете проверить другие результаты действий (например, частичные виды, json и т. д.)

Надеюсь, это поможет.

0

Вы можете создать декораторную функцию для функции Controller.View, , которая инициализирует сеанс для вас.

Что-то вроде -

internal ActionResult ExtendedView(object model) 
    { 
     Session = this.GetSession(); 

     return View(model); 
    } 

Затем, вместо того, чтобы использовать возвратную View (модель), использование возвращение ExtendedView (модель).

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