2

我使用模型:

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
  }

  ..
}

我的基本控制器有方法GetSession()

是否可以以某种方式在我的基本控制器中设置此值,这样我就不必在每个操作方法中都这样做?

4

2 回答 2

3

您可以做的一件事是,在您的BaseControlleroverrideOnResultExecuting中,劫持视图模型并注入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 等...)

希望这可以帮助。

于 2013-08-30T14:54:43.933 回答
0

您可以为 Controller.View 函数创建一个装饰器函数,该函数将为您初始化会话。

就像是 -

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

        return View(model);
    }

然后,不要使用 return View(model),而是使用 return ExtendedView(model)。

于 2013-08-30T14:53:05.373 回答