userManager.FindById(userId)抛出ArgumentNullException

时间:2015-11-26 13:48:54

标签: asp.net-mvc asp.net-identity identity

我知道这个问题已被提出,但答案似乎都不合适。

我使用个人帐户设置了标准的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)的问题。

3 个答案:

答案 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 中创建的操作。这解决了我的问题。