我意识到这个问题对某些人来说可能看起来微不足道,但是这些类型的东西让我发现自己很多时候都在战斗,我只是想弄清楚这一切尽管在.net中看起来像是一场失败的战斗(无论如何对我来说) )。
所以,如果我做以下事情:
using System.Web;
...
ApplicationUser user = System.Web.HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());
这会产生标题中的错误和红色GetOwinContext()
并且错误无法解析符号'GetOwinContext()'
但是,如果我执行以下操作(从System.Web
前删除HttpContext
),它按预期工作(或至少没有错误):
using System.Web;
...
ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());
但是,如果我这样做(与using System.Web
合作的同一行注释掉):
//using System.Web;
...
ApplicationUser user = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.User.Identity.GetUserId());
它生成相同的红色GetOwinContext()
和错误无法解析符号'GetOwinContext()'
如果我谷歌HttpContext
我只能发现它源于System.Web
。
所以,问题是为什么我不能像上面第一个例子那样使用完整的语法? (在答案中也提到最高票数:ASP.NET MVC 5 - Identity. How to get current ApplicationUser)
更新(以解决重复的问题回复):虽然这个问题的答案可能得出相同的结论,但我真的不明白这是一个重复的问题。试着从新手的角度来思考它并解析所有的烟雾和镜子.Net。我从来没有尝试过像生活中那样令人费解的东西。有时你必须从许多不同的角度看问题。
我实际上看到了这个问题以及另一个关于使用Current,
的问题但是没有让我感到震惊1)作为我正在寻找的答案(当时)2)更重要的是,为什么它表现得那样。 Sam的答案很完美,虽然有点过头了。但是,至少现在,我可以去研究这一切意味着什么......
当你写System.Web.HttpContext
实际上你指的是一个班级。但是当您在控制器中编写HttpContext
时,您正在使用名为HttpContext
的属性,该属性返回HttpContext
类的对象。您也可以通过调用System.Web.HttpContext.Current
静态属性来访问同一个对象。因此你可以写:
System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
只需转到该项目的NuGet包管理器,搜索并安装此Microsoft.Owin.Host.SystemWeb
,您可以使用using System.Web;
启用GetOwinContext()
方法
DSR在这个链接中的答案对我有用
Working in MVC 5 Identity for email verification
看来你有一个名为'Microsoft.Owin.Host.SystemWeb'的缺少的NuGet包。从NuGet安装此软件包或使用软件包管理器控制台安装所述软件包。
安装包Microsoft.Owin.Host.SystemWeb
希望这可以帮助。
谢谢它适用于我的情况,当我从Microsoft.Owin.Host.SystemWeb
添加NugetpackageManager.
它提供扩展方法GetOwinContext()
到HttpContext
。