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 и т. Д.
Мое предположение было бы то, что основной конструктор 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 является пустым во время конструкции.
, Таким образом, необходимо выполнить код где-то в другом месте.
Ответ на эту проблему на самом деле довольно прост. Я не могу выполнить код из конструктора по причинам, на которые указывает Raimond, но я могу сделать это вне конструктора.
Поэтому то, что я сделал, переопределяло onActionExecuting () в основном классе контроллера (я создал пользовательский атрибут для него, но просто переопределение метода должно также работать), и затем сделайте мой пользовательский поиск оттуда.
Теперь это работает как ожидалось, и у меня нет повторного кода.
Можете Вы захватывать это использование чего-то как:
HttpContext currentContext = HttpContext.Current;
string userName = currentContext.User.Identity.Name;
Или HttpContext всегда пусто??
Вы могли установить httpContext через конструктора абстрактного класса? и используйте его этот путь?
Спасибо 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, начиная с использования атрибутов для того определенно средства, повторяющие себя. Возможно, своего рода перехватчик ( интересная идея ) или рычаг мог бы помочь.
Аплодисменты для этого.
Я делаю это в basecontroller реализации, и она работает как ожидалось.
public abstract class BaseController : Controller
{
public bool LoggedOn
{
get { return User.Identity.IsAuthenticated; }
}
}
Это всегда возвращает TRUE или FALSE для меня так User != null