ControllerContext имеет значение null и BaseController.OnActionExecuting () не вызывается при использовании Html.Action - PullRequest
3 голосов
/ 15 сентября 2011

Мы используем BaseController для кэширования базовой информации аутентификации перед выполнением каждого действия:

public abstract class BaseController : Controller
{
    protected bool IsLoggedIn { get; set; }
    protected string Username { get; set; }
    ...

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var identity = base.User.Identity;
        this.IsLoggedIn = identity.IsAuthenticated;
        this.Username = identity.Name;

        ...
    }
}

А у нашего дочернего контроллера есть действия для главной страницы (индекс) и частичного представления (GetNavigation):

[Authorize]
public partial class CollaborationController : BaseController
{
    [HttpGet]
    public virtual ViewResult Index()
    {
        var viewModel = this.MakeViewModel<FullPageViewModel>();
        return this.View(MVC.Collaboration.Views.Index, viewModel);
    }

    [HttpGet]
    public virtual PartialViewResult GetNavigation()
    {
        var viewModel = NavigationViewModel.Make(this.User);
        return this.PartialView(MVC.Collaboration.Views.Navigation, viewModel);
    }
}

И частичное представление отображается непосредственно с помощью Html.Action():

@Html.Action(MVC.Collaboration.GetNavigation())

Кажется, что это должно работать, но BaseController.OnActionExecuting не вызывается.И я даже не могу назвать это напрямую, потому что this.ControllerContext и base.User оба null.Я также попытался создать подкласс ActionFilterAttribute, но его метод OnActionExecuting также не вызывается.

Ответы [ 2 ]

0 голосов
/ 11 июня 2015

Я знаю, что это старый вопрос, но вот как я справляюсь с этим. В моем дочернем контроллере я создаю метод OnActionExecuting и вызываю базовый контроллер оттуда.

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
     base.OnActionExecuting(filterContext);
}
0 голосов
/ 15 сентября 2011

По крайней мере вроде как ответил на мой собственный вопрос:

Замена

@Html.Action("GetNavigation", "Collaboration")

для

@Html.Action(MVC.Collaboration.GetNavigation())

исправляет это.Синтаксис MVCContrib, кажется, виновен, кто-нибудь знает почему?Более того, кто-нибудь знает обходной путь, который позволяет мне избегать этих неприятных, не рефакторинговых, волшебных строк?

...