在我的应用程序中,我有一些需要在每个页面上显示的基本用户信息(名称,配置文件img)。目前我只是将_Layout.cshtml
页面中的模型设置为名为ApplicationBaseModel
的类,整个应用程序中的每个其他视图模型都必须从此类继承,并且每个操作都必须为此设置适当的数据基础模型。
我不介意以这种方式进行简单继承,事实上,在每一个动作方法中,我必须检索数据并将其存储在视图模型中。在我看来,这不是一个非常优雅的解决方案。
任何人对解决这个问题的其他方法都有任何想法吗?
答案 0 :(得分:24)
我会创建一个BaseController
来检索Initialize()
覆盖中的数据并将其设置为ViewBag
属性。现在,从BaseController
派生您创建的每个控制器,并在布局中使用ViewBag
属性来访问您的用户数据。
public class BaseController : Controller
{
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
// retireve data
var data = new ApplicationBaseModel();
// set to viewbag
ViewBag.UserData = data;
}
}
这样您就不必从ApplicationBaseModel
派生所有模型类。您可以将强类型视图和用户数据另外设置为ViewBag
属性。
答案 1 :(得分:3)
根据您想要生成ViewBag数据的时间,您还可以使用OnActionExecuting或OnActionExecuted函数。这可能更合适,因为在创建Controller时可能无法使用某些数据。
public class MyController : Controller
{
//Executes before every action
protected override void OnActionExecuting(ActionExecutedContext context)
{
//Call the method from the base class
base.OnActionExecuting(context);
//Create the ViewBag data here
ViewBag.XYZ = XYZ();
}
//Executes after every action
protected override void OnActionExecuted(ActionExecutedContext context)
{
//Call the method from the base class
base.OnActionExecuted(context);
//Create the ViewBag data here
ViewBag.XYZ = XYZ();
}
}
答案 2 :(得分:1)
另一个选择是删除需要数据的布局视图部分,并将它们放入部分中。然后从布局视图中调用Html.Action调用返回带有必要viewmodel数据的部分的操作。