最优雅的方法来确保查看_Layout.cshtml的模型数据

时间:2011-06-07 15:34:01

标签: c# asp.net-mvc-3

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

我不介意以这种方式进行简单继承,事实上,在每一个动作方法中,我必须检索数据并将其存储在视图模型中。在我看来,这不是一个非常优雅的解决方案。

任何人对解决这个问题的其他方法都有任何想法吗?

3 个答案:

答案 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数据的部分的操作。