ASP.NET Core 2.1中如何在视图中使用HttpContext

4

我有一个HttpContext声明,想在我的视图中使用它来显示当前用户的用户名。到目前为止,我是这样做的:

<p>@Context.User.Claims.SingleOrDefault(u => u.Type == "UserName")</p>

然而,结果是这样的:

用户名:user@email.com

我漏掉了什么吗?我试着做了这个:
@Context.User.Claims.SingleOrDefault(u => u.Type == "UserName").Select(c => c.Value).SingleOrDefault()

但是在使用SingleOrDefault之后,它不允许我使用Select。


应该是 @Context.User.Claims.Where(u => u.Type == "UserName").Select(c => c.Value).SingleOrDefault() 吗? - Tetsuya Yamamoto
2个回答

8
SingleOrDefault() 返回与条件匹配的单个元素,而不是可以稍后使用Select选择的其他 IQueryableIEnumerable 集合。

返回序列中的单个特定元素,如果未找到该元素,则返回默认值。

在使用Select()之前,请使用Where()返回集合:

@Context.User.Claims.Where(u => u.Type == "UserName").Select(c => c.Value).SingleOrDefault()

对于C# 6.0及以上版本,使用空值条件运算符来获取其值:

@Context.User.Claims.SingleOrDefault(u => u.Type == "UserName")?.Value

0
然而,结果是这样的:
因为 .SingleOrDefault 返回一个声明项,所以视图使用其 .ToString 方法呈现该项。
但是它不允许我在 SingleOrDefault 之后使用 Select。 .SingleOrDefault 返回集合中的一个项,而 .Select 需要一个集合。您应该直接访问此项的 .Value 属性。
@Context.User.Claims.SingleOrDefault(u => u.Type == "UserName")?.Value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接