【问题标题】:ASP.NET Core 2.1 Use HttpContext in viewASP.NET Core 2.1 在视图中使用 HttpContext
【发布时间】:2019-04-18 02:47:34
【问题描述】:

我有这个 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 =&gt; u.Type == "UserName").Select(c =&gt; c.Value).SingleOrDefault()吗?

标签: c# asp.net linq asp.net-core asp.net-core-mvc


【解决方案1】:

SingleOrDefault() 返回与条件匹配的单个元素,而不是另一个 IQueryableIEnumerable 集合,后者可以在以后进行Select-ed。

返回序列的单个特定元素或默认值 如果没有找到该元素。

你应该在使用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

【讨论】:

    【解决方案2】:

    但是,结果是这样的:

    因为.SingleOrDefault 返回一个声明项,所以视图使用其.ToString 方法呈现该项。

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

    .SingleOrDefault 返回集合中的一个项目,而.Select 需要一个集合。您应该直接访问该项目的.Value 属性。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2019-02-10
      • 2019-02-19
      • 1970-01-01
      • 2019-06-02
      相关资源
      最近更新 更多