Asp.net mvc 4 将公共数据传递到MVC4.5中的_layout.cshtml的模式
我正试图找到将数据传递到我的_layout.cshtml页面的最佳模式 我正在尝试创建一个公共基类,所有视图特定的模型都从该基类派生。my_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; }
public abstract class ViewModelBase
{
public string Username { get; set; }
public string Version { get; set; }
}
在my_layout.cshtml的顶部,我有
@model MyProject.Web.Controllers.ViewModelBase
我需要一个公共区域来补充模型所需的信息,我计划使用以下模式
我遵循相同的方法,使用一个基础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帖子显示了这两种方法。