我在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
...
}
答案 0 :(得分:0)
请停止使用ViewBag
。它不是为此而设计的。理由ViewBag
在控制器中是空的(我怀疑),这些是过滤器和控制器中不同的ViewBag
个对象。
如果您需要在视图中执行重复操作,则有更好的方法可以执行此操作。对于您的菜单,我会创建一个操作,读取菜单信息,将其放在ViewModel
(不在ViewBag
中)并输出部分视图。然后在你的布局中,我将呈现该部分动作。 (还在此局部视图上添加一些缓存)