2011-06-07 37 views
11

在我的应用程序中,我有一些基本的用户信息需要在每个页面上显示(名称,配置文件img)。目前,我只需将_Layout.cshtml页面中的模型设置为ApplicationBaseModel类,整个应用程序中的所有其他视图模型都必须从此类继承,并且每个操作都必须为基本模型设置适当的数据。确保_Layout.cshtml视图模型数据的最优雅方式

我不介意这种简单的继承,这是事实上,在每一个单一的行动方法,我必须retreive数据并将其存储在视图模型。在我看来,这不是一个很好的解决方案。

任何人有解决这个问题的其他方式有什么想法?

+0

您使用的是剃刀吗? – mnemosyn 2011-06-07 15:44:59

+0

是的,我正在使用剃须刀 – jcvandan 2011-06-07 15:55:45

+0

没关系......我一直在考虑更换页面基本类型(这是剃须刀特有的),但这并不能解决您的问题*和*它很复杂......对不起 – mnemosyn 2011-06-07 15:58:32

回答

23

我将创建一个BaseController,它将检索Initialize()覆盖中的数据并将其设置为ViewBag属性。现在获取您从BaseController创建的每个Controller,并在您的布局中使用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属性。

+0

尼斯妥协,谢谢你。 – 2012-04-09 22:51:09

+0

这看起来像一个体面的解决方案。对于从BaseController派生的每一个控制器,只要调用一次从BaseController派生出来的第一个Controller中的动作,它是否会执行一次'BaseController.Initialize'?换句话说,如果我有3个控制器 - “HomeController”,“AboutController”,“AccountsController”,并且用户从页面上的链接访问所有3控制器,“BaseController”会执行3次,或者只执行一次直到应用程序池被回收为止的应用程序的生命周期)? – Shiva 2017-03-23 00:05:00

+0

@Shiva:这是一个实例方法,因此在调用任何ActionResult方法之前,它将针对每个控制器实例甚至每个请求执行。您使用应用程序池生命周期描述的内容适用于静态方法。 – DanielB 2017-03-27 09:09:08

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(); 

    } 
} 
+1

+1但是我的数据将在对象创建时可用 – jcvandan 2011-06-07 16:01:44

1

另一种选择是将需要数据的布局视图的部分拆分并放入部分。然后从你的布局视图中调用Html.Action调用来返回具有必要viewmodel数据的部分。

相关问题