ViewBag失踪

时间:2014-06-25 14:22:48

标签: asp.net-mvc viewbag

我在IAuthorizationFilter.OnAuthorization过程中向ViewBag提供数据,并为_Layout.cshtml-in提供数据,但是当我在普通视图中使用局部视图时,ViewBag中的数据为空。 这是正常的行为,或者我做错了什么?

public class MyAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        filterContext.Controller.ViewBag.Name = this.name;
        filterContext.Controller.ViewBag.Menus = user.GetMenu(this.role);
    }
    ...
}

_Layout.cshtml:

<section id="login">
    Hello, <span class="username">@ViewBag.Name</span>!
</section>
<nav>
     @Html.MenuLink(ViewBag.Menus as List<Entity.Models.MENU>, (string)ViewBag.Name)
</nav>

观点:

@model Web.ViewModels.RegistrationEntryViewModel

@Html.Partial("_RegistrationEntry", Model)

行动:

[MyAuthorize("ADMINISTRATORS")]
[HttpGet]
public ActionResult NewRegistrationEntry()
{
    //The viewbag is already null here
    ...
}

1 个答案:

答案 0 :(得分:0)

请停止使用ViewBag。它不是为此而设计的。理由ViewBag在控制器中是空的(我怀疑),这些是过滤器和控制器中不同的ViewBag个对象。

如果您需要在视图中执行重复操作,则有更好的方法可以执行此操作。对于您的菜单,我会创建一个操作,读取菜单信息,将其放在ViewModel(不在ViewBag中)并输出部分视图。然后在你的布局中,我将呈现该部分动作。 (还在此局部视图上添加一些缓存)