C# 如何在布局页面上获取用户电子邮件地址

C# 如何在布局页面上获取用户电子邮件地址,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我需要在我的仪表板布局视图中显示用户的电子邮件地址。我尝试了一些方法,但似乎不起作用。没有控制器,我无法使用ViewBag。我有一个可以获取用户信息的区域,但它没有或没有检索电子邮件。下面是代码的样子 public static string GetUserInfo(string value) { var identity = (ClaimsIdentity)Thread.CurrentPrincipal; string ReturnVal = s

我需要在我的仪表板布局视图中显示用户的电子邮件地址。我尝试了一些方法,但似乎不起作用。没有控制器,我无法使用ViewBag。我有一个可以获取用户信息的区域,但它没有或没有检索电子邮件。下面是代码的样子

    public static string GetUserInfo(string value)
    {
        var identity = (ClaimsIdentity)Thread.CurrentPrincipal;
        string ReturnVal = string.Empty;

        switch (value)
        {
            case "email":
                ReturnVal = identity.Claims.Where(c => c.Type == ClaimTypes.Email).Select(c => c.Value).SingleOrDefault();
                break;
            case "name":
                ReturnVal = identity.Claims.Where(c => c.Type == ClaimTypes.Name).Select(c => c.Value).SingleOrDefault();
                break;
            case "userid":
                ReturnVal = identity.Claims.Where(c => c.Type == ClaimTypes.NameIdentifier).Select(c => c.Value).SingleOrDefault();
                break;
            case "roleid":
                ReturnVal = identity.Claims.Where(c => c.Type == ClaimTypes.Role).Select(c => c.Value).SingleOrDefault();
                break;
            default:
                ReturnVal = "";
                break;
        }

        return ReturnVal;

    }
我使用的是实体框架,上面的代码取自一个没有使用实体框架的项目。我从它那里得到了除了电子邮件以外的所有东西。它返回null。我是否需要在IdentityModel中输入一些东西,并声明要显示它

我也尝试在布局视图中使用它。但它不允许加载视图,并表示没有与数据库的连接。然而,当我把它注释掉时,页面加载没有问题

 @{ string email = Membership.GetUser().Email; }
谢谢你的帮助

更新: 我将此添加到我的标识模型中

userIdentity.AddClaim(new Claim("EmailAddress", this.Email.ToString()));
现在它给了我电子邮件,但是在我的GetUserInfo中它是空的。如果您将鼠标悬停在索赔上,它会显示为

{Email: this@email.com}
如果将鼠标悬停在字符串中的电子邮件上

 ReturnVal = identity.Claims.Where(c => c.Type == ClaimTypes.Email).Select(c => c.Value).SingleOrDefault();
你得到

 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
因此,我收到了电子邮件,但不是ClaimsPrincipal收到的方式。。 因此我无法取回它

有没有关于如何正确处理索赔的建议

更新: 一时兴起,我决定像这样更改字符串:

userIdentity.AddClaim(new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", this.Email.ToString()));

我找不到这个信息!但它是有效的!我现在以我需要的格式获得电子邮件地址

如果CurrentPrincipal上确实存在该电子邮件地址,您是否确定将CurrentPrincipal强制转换为ClaimsEntity不会丢失该电子邮件地址?该电子邮件存在于数据库中。它只是没有出现在那里。我想我需要将索赔添加到IdentityModel中。我只是找不到任何能说明如何正确地做到这一点的东西。电子邮件不会在那里开箱即用,因为它是帐户的一部分,但不是身份的集市。。如果我读的东西是正确的。使用调试器查看您拥有的值以及丢失的位置。声明标识只会在电子邮件不存在时返回5。只有rolename、username、nameIdentifier,其他两个是模式。我想我需要将电子邮件添加到IdentityModels中的声明中,但正如我所说,我很难找到如何实现它。。