Отсутствует ViewBag

#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 ) и выводит частичное представление. Тогда в вашем макете я бы отрисовал это частичное действие. (Также добавьте некоторое кэширование в этом частичном представлении)