ASP.NET@User.Identity.Name返回空值

ASP.NET@User.Identity.Name返回空值,asp.net,database,identity,Asp.net,Database,Identity,我将ASP.NET与ssms连接,并拥有一个包含表Users、Roles、UserRoles和UploadedFiles的数据库。我正在做一项任务,用户必须订阅(通过按下按钮)才能上传文件。我通过将登录用户的RoleId的ID更改为订阅用户的ID来实现这一点 现在,为了做到这一点,我使用@User.Identity.Name获取当前登录用户的电子邮件并编辑其角色ID。但是,问题是@User.Identity.Name返回null。更糟糕的是,之前我已经做过一个类似的例子,一个用户上传一个文件,我

我将ASP.NET与ssms连接,并拥有一个包含表Users、Roles、UserRoles和UploadedFiles的数据库。我正在做一项任务,用户必须订阅(通过按下按钮)才能上传文件。我通过将登录用户的RoleId的ID更改为订阅用户的ID来实现这一点

现在,为了做到这一点,我使用@User.Identity.Name获取当前登录用户的电子邮件并编辑其角色ID。但是,问题是@User.Identity.Name返回null。更糟糕的是,之前我已经做过一个类似的例子,一个用户上传一个文件,我用@user.Identity.Name收到电子邮件,结果成功了。然而,这一个没有

这是在控制器中处理订阅的代码:

public ActionResult Subscribe(string email)
    {
        UsersRepository ur = new UsersRepository();
        var user = ur.GetUser().SingleOrDefault(x => x.Email == email);
        user.Email = email;
        Role defaultRole = ur.GetDefaultRoleSubscribe();

        ur.AllocateRoleToUserSubscribe(user, defaultRole);

        return RedirectToAction("List");
    }
存储库中的代码:

public void AllocateRoleToUserSubscribe(User u, Role r)
    {
        u.Roles.Add(r);
        Entity.SaveChanges();
    }
    public Role GetDefaultRoleSubscribe()
    {
        return Entity.Roles.SingleOrDefault(x => x.Title == "Subscribed User");
    }
subscribe.cshtml中的代码:

<form method="post" action="\Users\Subscribe" enctype="multipart/form-data">
    @Html.AntiForgeryToken()

    <input type="hidden" value="@User.Identity.Name" name="email" />

    <input type="submit" value="Subscribe" />
</form>

@Html.AntiForgeryToken()

谢谢

你也应该用GetUser方法发布UsersRepository实现。问题是我知道该方法是有效的。我运行了相同的代码,但执行了不同的任务,它成功了。。我知道我所有的方法都是有效的,因为我在其他地方都使用它们。。就是这个好吧,很公平。我想看看当时的代码。我用代码编辑了这篇文章。它的基本功能是上传图像并保存在数据库中。其机制实际上是相同的。我使用@user.Identity.Name获取用户并使用他的用户实例。因此,首先。它之所以有效,是因为您正在razor页面内调用
@User.Identity.Name
。因为用户对象与http请求关联(它在HttpContext中,这是一个提示)。现在,不起作用的代码不起作用,因为当您创建UserRepository的新实例时,您没有使用依赖项注入。因此,在您的UserRepository中不会有任何与HttpContext关联的用户。您需要做的是使用依赖项注入,以便UserRepo将拥有与用户声明所在的HttpContext相同的实例。