在asp.net-mvc中,使用Base ViewModel在Site.Master页面上显示动态内容的最佳方法是什么

leo*_*ora 2 c# asp.net-mvc viewmodel

我有一个asp.net-mvc网站,我想在每个页面上显示一些信息.我创建了一个名为BaseViewModel的类,每个viewModel类都继承自BaseViewModel.Site.Master视图直接绑定到BaseViewModel.

现在,基类有一个名为MenuLinks的属性.

menulinks属性从数据库调用填充,因此在每个控制器操作上,我正在添加一个新行:ViewModel:

 viewModel.MenuLinks = _repository.GetMenuLinks();
Run Code Online (Sandbox Code Playgroud)

我有很多控制器,动作和视图模型.有没有更清洁的方法,我可以做到上述,而不必将这一行放在每一个控制器动作上面.

Dar*_*rov 11

您可以编写自定义操作过滤器属性,该属性将在每个操作之后执行并设置基本模型的属性:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    base.OnActionExecuted(filterContext);
    var viewResult = filterContext.Result as ViewResultBase;
    if (viewResult != null) 
    {
        var model = viewResult.ViewData.Model as BaseViewModel;
        if (model != null)
        {
            model.MenuLinks = _repository.GetMenuLinks();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在剩下的就是用这个动作过滤器来装饰你的基本控制器.

处理此问题的另一种方法是使用子操作而不是基本视图模型.