Asp.net mvc 4 将公共数据传递到MVC4.5中的_layout.cshtml的模式

Asp.net mvc 4 将公共数据传递到MVC4.5中的_layout.cshtml的模式,asp.net-mvc-4,Asp.net Mvc 4,我正试图找到将数据传递到我的_layout.cshtml页面的最佳模式 我正在尝试创建一个公共基类,所有视图特定的模型都从该基类派生。my_layout.cshtml可以识别该基类,并用于填写有关用户的详细信息,在标题中加载适当的图像等。例如,下面是它的一个片段 public abstract class ViewModelBase { public string Username { get; set; } public string Version { get; set; }

我正试图找到将数据传递到我的_layout.cshtml页面的最佳模式

我正在尝试创建一个公共基类,所有视图特定的模型都从该基类派生。my_layout.cshtml可以识别该基类,并用于填写有关用户的详细信息,在标题中加载适当的图像等。例如,下面是它的一个片段

public abstract class ViewModelBase
{
    public string Username { get; set; }
    public string Version { get; set; }
}
在my_layout.cshtml的顶部,我有

@model MyProject.Web.Controllers.ViewModelBase
我需要一个公共区域来补充模型所需的信息,我计划使用以下模式

  • 每个动作方法都会创建一个从 ViewModelBase
  • 操作完成
  • 我创建ActionFilterAttribute并重写OnActionExecuted以强制转换 将当前结果保存到ViewModelBase
  • 如果转换成功,则使用相关数据填充ViewModelBase详细信息
  • 以下是我的问题

  • 使用ActionFilterAttribute(OnActionExecuted)是我尝试做的事情的好模式吗
  • 我无法看到如何从HttpActionExecutedContext获取在操作中创建的结果。这是怎么做到的

  • 我遵循相同的方法,使用一个基础ViewModel类,我的所有其他ViewModel都从该类继承

    然后,我有一个所有控制器都从中继承的基本控制器。在这里,我有一个方法负责初始化视图模型:

    protected T CreateViewModel<T>() where T : ViewModel.BaseViewModel, new()
    {
        var viewModelT = new T {
                            HeaderTitle = "Welcome to my domain",
                            VisitorUsername = this.VisitorUsername,
                            IsCurrentVisitorAuthenticated = this.IsCurrentVisitorAuthenticated,
    
                            //...
                        };
    
        return viewModelT;
    }
    
    protectedt CreateViewModel(),其中T:ViewModel.BaseViewModel,new()
    {
    var viewModelT=new T{
    HeaderTitle=“欢迎来到我的域名”,
    VisitorUsername=this.VisitorUsername,
    IsCurrentVisitorAuthenticated=this.IsCurrentVisitorAuthenticated,
    //...
    };
    返回viewModelT;
    }
    
    然后在每个控制器上,当我想要创建视图模型时,我只需调用基本控制器的方法:

    var vm = base.CreateViewModel<MyPageCustomViewModel>();
    
    var vm=base.CreateViewModel();
    
    在创建或填充期间,基本视图模型确实会增加所有视图模型的开销。避免这种情况的一种方法是从基本控制器使用
    OnActionExecuted
    中填充的
    ViewBag
    。这将保持视图模型的灵活性,同时通过基本控制器获取公共模型。但是,您可能希望采用子操作的方式来获取强类型模型,而不局限于基本视图模型。有几个SO帖子显示了这两种方法。