#asp.net-mvc #viewbag
#asp.net-mvc #viewbag
Вопрос:
Я передаю данные в ViewBag в IAuthorizationFilter.Процесс авторизации, и он помещает для _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. Было бы легче понять проблему, если бы был какой-то код, иллюстрирующий ее
Ответ №1:
Пожалуйста, прекратите использовать ViewBag
подобное. Он не предназначен для этого. И причина ViewBag
null в контроллере (я подозреваю), что это разные ViewBag
объекты в фильтре и в контроллере.
Если вам нужно выполнять повторяющиеся действия в вашем представлении, есть лучшие способы сделать это. Для вашего меню я бы создал действие, которое считывает информацию о меню, помещает ее в a ViewModel
(не в a ViewBag
) и выводит частичное представление. Тогда в вашем макете я бы отрисовал это частичное действие. (Также добавьте некоторое кэширование в этом частичном представлении)