Почему Пользователь (как в Пользователе. Идентификационные данные. Имя) пустой указатель в моем абстрактном контроллере?

GetVersion и GetVersionEx заменялись вспомогательными функциями для различных версий . Вы хотите IsWindows10OrGreater . Они могут быть найдены в VersionHelpers.h .

IsWindows10OrGreater доступен только в последней версии SDK / Visual Studio 2015. Вы можете использовать IsWindowsVersionOrGreater в общем случае. Например, в моем ящике 7 я получаю TRUE для IsWindowsVersionOrGreater (6, 0, 0) .

Помните, что параметры, которые эта функция принимает, относятся к номеру сборки Windows и НЕму маркетинговому имени. Так что Windows 8 - это сборка 6.2. Windows 7 - 6.0 и т. Д.

24
задан Masterfu 10 January 2009 в 07:27
поделиться

5 ответов

Мое предположение было бы то, что основной конструктор Controller не заполняет Пользователя, но что только известно позже, когда ControllerContext установлен для Контроллера. Необходимо проверить это в документацию о жизненном цикле приложения MVC, (один здесь , вероятно, сделает, хотя это могло бы немного устареть, так как это для версии предварительного просмотра), или просто проверьте исходный код MVC.

от кода, который я имею MVC (также версия предварительного просмотра, но это должно быть прекрасным): (В Контроллере)

 public IPrincipal User {
            get {
                return HttpContext == null ? null : HttpContext.User;
            }
        }

...

public HttpContextBase HttpContext {
        get {
            return ControllerContext == null ? null : ControllerContext.HttpContext;
        }
    }

я не вижу en реализация конструктора по умолчанию в коде. Это доказало бы, что ControllerContext является пустым во время конструкции.

, Таким образом, необходимо выполнить код где-то в другом месте.

14
ответ дан Raymond Roestenburg 16 October 2019 в 08:12
поделиться

Ответ на эту проблему на самом деле довольно прост. Я не могу выполнить код из конструктора по причинам, на которые указывает Raimond, но я могу сделать это вне конструктора.

Поэтому то, что я сделал, переопределяло onActionExecuting () в основном классе контроллера (я создал пользовательский атрибут для него, но просто переопределение метода должно также работать), и затем сделайте мой пользовательский поиск оттуда.

Теперь это работает как ожидалось, и у меня нет повторного кода.

23
ответ дан Masterfu 16 October 2019 в 08:12
поделиться

Можете Вы захватывать это использование чего-то как:

HttpContext currentContext = HttpContext.Current;
string userName = currentContext.User.Identity.Name;

Или HttpContext всегда пусто??

Вы могли установить httpContext через конструктора абстрактного класса? и используйте его этот путь?

4
ответ дан keeney 16 October 2019 в 08:12
поделиться

Спасибо Raimond. Я также устал для наблюдения очевидного. @Keeney: Да контекст является всегда пустым. Raimond указал почему. Спасибо так или иначе, я не видел, почему также:-)

Моим текущим рабочим решением (хотя не, что я хотел) является Атрибут, который я использую для украшения всех моих действий контроллера. Вот реализация:

public class MasterPageDataAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            IUserRepository _repUser = RepositoryFactory.getUserRepository();
            IPrincipal siteUser = filterContext.Controller.ControllerContext.HttpContext.User;
            User loggedInUser = null;

            if (siteUser == null || siteUser.Identity.Name == null)
            {
                //do nothing
            }
            else
            {
                loggedInUser = _repUser.findUserById(siteUser.Identity.Name);
            }
            filterContext.Controller.ViewData["LoggedInUser"] = loggedInUser ?? new User { Nickname = "Guest" };
        }
    }

я буду изучать, как выполнить тот код способом, который следует за принципом DRY, начиная с использования атрибутов для того определенно средства, повторяющие себя. Возможно, своего рода перехватчик ( интересная идея ) или рычаг мог бы помочь.

Аплодисменты для этого.

4
ответ дан Masterfu 16 October 2019 в 08:12
поделиться

Я делаю это в basecontroller реализации, и она работает как ожидалось.

public abstract class BaseController : Controller
{
    public bool LoggedOn
    {
        get { return User.Identity.IsAuthenticated; }
    }
}

Это всегда возвращает TRUE или FALSE для меня так User != null

0
ответ дан Schotime 16 October 2019 в 08:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: