检索 ASP.NET 核心 2.2 中给定类型的声明集合



我已经实现了一个系统,允许用户访问给定的网址,只有他/她的声明中有该网址。我创建了一个类型为"用户路由"的声明,并添加了用户可用的 URL。因此,当用户登录到应用程序时,他/她只能访问他/她声明类型为"UserRoutes"的那些 URL。

现在我正在寻找一种方法来获取他/她的 URL 集合,以决定是否显示指向给定 URL 的链接。

试试这个

@if (User.FindAll("UserRoutes").Contains("courses/create"))
{
<p>
<a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
</p>
}

或者这个

var userRoutes = User.Claims.Where(c => c.Type == "UserRoutes");
if (userRoutes.Contains("courses/create")){
<p>
<a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
</p>

显示以下错误

IEnumerable"不包含"Contains"的定义,最好的扩展方法重载"ParallelEnumerable.Contains(ParallelQuery,string("需要类型为"ParallelQuery"的接收器

请问我怎样才能做到这一点。我感谢您的努力

应使用HasClaim可以传递声明类型和值的方法

User.HasClaim("UserRoutes", "courses/create")

您收到该错误消息是因为您需要对System.Linq的引用,因为这是IEnumerable<T>.Contains<T>(T source)所在的位置。如果你真的想在视图中有你的逻辑,你应该在视图的顶部添加@using System.Linq(或放在_ViewImports.cshtml文件中(。

您真的应该将这种逻辑发送到Controller/PageModel,而不是将其放在视图渲染中!

假设您将RazorPages与名为MyPageRazorPage一起使用

MyPage.cshtml.cs

using System;
using System.Collections.Generic;
/* this is the key */
using System.Linq;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace MyWebApp
{
public class MyPageModel : PageModel
{
[BindProperty(SupportsGet = true)]
public bool CreateCourses { get; set; }
public void OnGet()
{
/* set the property to use on the page */
this.CreateCourses = User.FindAll("UserRoutes")
.Any(claim => claim.Value == "courses/create")
}
}
}

然后在MyPage.cshtml

...
@if (Model.CreateCourses)
{
<p>
<a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
</p>
}
...

试试这个:

@if (User.Where(p => p.YOURPARAMETER == "UserRoutes").ToList().Contains("courses/create"))
{
<p>
<a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
</p>
}

请记住将"YOURPARAMETER"替换为要比较的元素。

您可以使用Enumerable.Any()扩展方法

@if (User.FindAll("UserRoutes").Any(claim => claim.Value == "courses/create"))
{
...
}

相关内容

  • 没有找到相关文章

最新更新