2011-02-01 15 views
7

我正在努力处理看起来很简单的概念。如果我的ViewBag中有一个值供我的_Layout.cshtml使用,我该如何以及在哪里设置该值?用于处理ASP.NET MVC 3视图中的常见数据的方法

这里是最明显的(对我)的选择,因为我现在所看到:

  1. 在每个控制器(未干)
  2. 创建我自己的控制器基地控制器继承并设置里设置的值在基类
  3. 在Global.asax.cs中设置的值的值(感觉脏)
  4. 创建一个ActionFilter设置数据和全局寄存器的过滤器(也认为是错误的)
  5. 设置在值_ViewStart.cshtml(感觉非常错误的,非常脏)

例如:

_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> 

如果每个控制器设置用户名值,这不是可怕干。如果我用CodeIgniter这样的东西来解决这个问题,我只需要创建自己的基础控制器来处理这些常见的项目,并开始我的快乐之旅。 ASP.NET MVC 3有更好的选择吗?

+0

实际上,在这种特殊情况下 - 即时猜测“用户名”实际上来自会话/表单身份验证票证。所以你可能想要使用一个HTML帮助器,它使用FormsAuth代码来抓取用户名,然后渲染出一个MvcHtmlString - 只是一个想法... – RPM1984 2011-02-01 21:01:35

+0

嗯......好点。也许@ ViewBag.UserName不是最好的例子。不过,我现在更关心的是更大的局面。 – Greg 2011-02-01 22:59:11

回答

10

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

0

比方说,我希望ViewBag.PageHeight对所有页面的默认值为1000,但是允许任何页面/视图覆盖它。这是我在_Layout.cshtml中放置的内容:

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

这似乎是有效的。

相关问题