ViewModel имеет значение NULL при явной установке из OnActionExecuting - PullRequest
5 голосов
/ 18 июля 2011

Я исследовал несколько вопросов по SO, но не смог найти ответ на этот вопрос. Кто знает, может быть, я нарушаю лучшие практики. Прочитав отличный ответ об использовании атрибута инжектора макета, чтобы можно было установить макет, просто указав атрибут, я решил, что я мог бы также использовать этот тип класса для атрибутов контроллеров, которые требуют аутентификации пользователя.

Итак, вместо того, чтобы проверять аутентификацию везде, я написал следующее:

    // class AdminAttribute
public class AdminAttribute : LayoutInjectorAttribute
{
    // ctor
    public AdminAttribute()
        : base("_LayoutAdmin")
    {
    }   // eo ctor


    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        WebUser user = WebApplication.CurrentUser;
        if (!user.IsAuthenticated)
        {
            filterContext.Result = new ViewResult() { ViewName = "Unauthorised" };
            filterContext.Controller.ViewData.Model = new ViewModel(WebApplication.CurrentUser.Translate("msgunauthorisedtitle"));
            filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
            return;
        }
        base.OnActionExecuting(filterContext);
    }   // eo OnActionExecuting

}   // eo class AdminAttribute

Все работает, кроме того факта, что модель null при обработке вида. У кого-нибудь есть идея, почему это может быть?

Страница просмотра (Unauthorised.cshtml)

@model Py2.Web.ViewModel
<h2>@Model.Title</h2>

Заранее спасибо!

1 Ответ

3 голосов
/ 18 июля 2011

Попробуйте следующим образом:

if (!user.IsAuthenticated)
{
    var result = new ViewResult { ViewName = "Unauthorised" };
    var model = new ViewModel(
        WebApplication.CurrentUser.Translate("msgunauthorisedtitle")
    );
    result.ViewData.Model = model;
    filterContext.Result = result;
    return;
}

Обратите внимание, что нет необходимости явно вызывать ExecuteResult, это работа рамки ASP.NET MVC, просто верните ViewResult, передав ему модельresult.ViewData.Model = model).Также обратите внимание, как эта модель представления передается в результат просмотра, а не в filterContext.Controller.ViewData.Model, как вы делали в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...