处理ASP.NET MVC 3视图中的公共数据的方法

时间:2011-02-01 20:57:45

标签: asp.net asp.net-mvc controller asp.net-mvc-3

我正在努力寻找一个看起来非常简单的概念。如果我的ViewBag中有一个值供我的_Layout.cshtml使用,我该如何以及在何处设置该值?

以下是我目前看到的最明显(对我而言)选项:

  1. 设置每个控制器中的值(不是DRY)
  2. 创建我自己的继承自Controller的控制器库,并在基类中设置值
  3. 在Global.asax.cs中设置值(感觉很脏)
  4. 创建一个ActionFilter来设置数据并全局注册过滤器(也感觉不对)
  5. 在_ViewStart.cshtml中设置值(感觉非常错误且非常脏)
  6. 例如:

    _Layout.cshtml


    <!DOCTYPE html>
    <html>
    <head runat="server">
        <title>@ViewBag.Title</title>
    </head>
    <body>
        <div id="header">
           <h1>Welcome @ViewBag.UserName</h2>
        </div>
        <div id="content">
           @RenderBody()
        </div>
    </body>
    </html>
    

    如果每个控制器都设置UserName值,那就不是非常干。如果我用CodeIgniter之类的东西解决这个问题,我只需要创建自己的基本控制器来处理这些常见项目,并采用我的快乐方式。 ASP.NET MVC 3是否有更优选的选项?

2 个答案:

答案 0 :(得分:10)

通用视图模型和基本控制器是IMO的方法。使用通用视图模型作为所有视图模型的基类。使用基本控制器中的OnActionExecuted方法获取视图模型(对于返回视图的操作)并将其强制转换为公共视图模型。此时设置公共属性。

答案 1 :(得分:0)

假设我希望ViewBag.PageHeight所有页面的默认值都为1000,但允许任何页面/视图覆盖它。这就是我在_Layout.cshtml中的内容:

页面高度为@(ViewBag.PageHeight ?? 1000)

这似乎有效。