我知道这个问题已被提出,但答案似乎都不合适。
我使用个人帐户设置了标准的asp.net MVC 5 Web应用程序。
我没有更改AccountController中的任何内容。 我刚刚创建了一个新的Controller,在Index动作方法中,第一行是:
var userId = User.Identity.GetUserId();
var user = userManager.FindById(userId);
我还声明了ApplicationUserManager
:
private ApplicationUserManager userManager;
userManager.FindById(userId)
会抛出ArgumentNullException
。
这一切看起来像这样:
[Authorize]
public class WishlistController : Controller
{
private ApplicationDbContext db;
private ApplicationUserManager userManager;
// GET: Wishlist
public ActionResult Index()
{
var userId = User.Identity.GetUserId();
var user = userManager.FindById(userId); // This line throws the exception
db = new ApplicationDbContext();
return View(db.Wishlists.ToList().Where(wishlist => wishlist.User.Id == user.Id));
}
修改
问题的名称发生了变化,因为我发现User.Identity.GetUserId()
无论如何都不会返回null
。它会返回一个很好的长字符串。
我仍然遇到FindById(userId)
的问题。
答案 0 :(得分:2)
我期待您发布的代码(在第4次修订版中)在指定的行中失败,但我希望它会引发NullReferenceException
而非{{{} 1}}。您声明 ArgumentNullException
变量,但初始化。因此,当您尝试在其上调用方法时,应该会失败。
我不知道你为什么要检索ApplicationUserManager
对象。您正在使用User
对象执行的操作就是检索用户ID - 这正是您在第一时间用于获取User
的用户ID。为什么不直接使用用户ID?在这种情况下,您甚至不需要User
。
答案 1 :(得分:1)
如果您将其调用到其他控制器,请尝试
var t = System.Web.HttpContext.Current.User.Identity.GetUserId();
由于您使用的方式仅在视图直接命中的控制器中有效。
答案 2 :(得分:0)
成功登录后,RedirectToAction("PostRegister")
和 [Authorize]
属性并继续您的逻辑。 PostRegister
是我在 AccountController
中创建的操作。这解决了我的问题。