userManager.FindById(userId) 抛出 ArgumentNullException

userManager.FindById(userId) throws ArgumentNullException

我知道这个问题已经有人问过,但 none 的答案似乎合适。

我已经使用个人帐户设置了标准 asp.net MVC 5 网络应用程序。

我没有更改 AccountController 中的任何内容。 我刚刚创建了一个新的控制器,在 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() 无论如何都不会 return null。它 return 是一个不错的长字符串。

我仍然遇到 FindById(userId) 的问题。

如果您将其调用到其他控制器中,请尝试

var t = System.Web.HttpContext.Current.User.Identity.GetUserId();

由于您使用的方式仅在视图直接命中的控制器中有效。

期望 您发布的代码(在您的第 4 次修订中)在指示的行失败,但我希望它会引发 NullReferenceException而不是 ArgumentNullException。您声明一个ApplicationUserManager变量,但没有初始化它。因此,当您尝试对其调用方法时,应该会失败。

我不确定你为什么要检索 User 对象。您对 User 对象所做的一切就是检索用户 ID - 这正是您最初用于获取 User 的内容。为什么不直接使用用户 ID?在这种情况下,您甚至不需要 ApplicationUserManager.

成功登录后,RedirectToAction("PostRegister") 使用 [Authorize] 属性并继续您的逻辑。 PostRegister 是我在 AccountController 中创建的一个动作。这解决了我的问题。