我的主页使用了一个视图模型,我的所有其他模型都从中继承,如何简化它

本文关键字:我的 模型 其他 继承 何简化 主页 视图 一个 | 更新日期: 2023-09-27 18:29:36

我使用模型:

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() 方法

有没有可能在我的basecontroller中以某种方式设置这个值,这样我就不必在每个操作方法中都这样做了

我的主页使用了一个视图模型,我的所有其他模型都从中继承,如何简化它

您可以做的一件事是,在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等)

希望这能有所帮助。

您可以为Controller.View函数创建一个decorator函数,这将为您初始化会话。

类似

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

然后,不要使用返回的View(model),而是使用返回的ExtendedView(model)。

相关文章: