Получить коллекцию заявок указанного типа в ASP.NET-Core 2.2 - PullRequest
0 голосов
/ 03 октября 2019

Я внедрил систему, в которой пользователю разрешен доступ к данному URL, только если он имеет этот URL в своих претензиях. Я создал заявку типа «UserRoutes» и добавил URL-адреса, доступные пользователю. Поэтому, когда пользователь входит в приложение, он / она может посещать только те URL-адреса в своих утверждениях типа «UserRoutes».

Теперь я ищу способ получить эту коллекцию своего /ее 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

Пожалуйста, как мне этого добиться? Я ценю ваши усилия

Ответы [ 4 ]

1 голос
/ 04 октября 2019

Вы получаете это сообщение об ошибке, потому что вам нужна ссылка на System.Linq, потому что там находится IEnumerable<T>.Contains<T>(T source). Если вы ДЕЙСТВИТЕЛЬНО хотите иметь свою логику в представлении, вы должны добавить @using System.Linq вверху представления (или поместить в файл _ViewImports.cshtml).

НО

Вы действительно должны посылать такую ​​логику в Controller / PageModel вместо того, чтобы помещать ее в визуализацию представления!

Предполагая, что вы используете RazorPagesс RazorPage с именем MyPage

В 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>
}
...
0 голосов
/ 03 октября 2019

Вы можете использовать Enumerable.Any() метод расширения

 @if (User.FindAll("UserRoutes").Any(claim => claim.Value == "courses/create"))
{
        ...
 }
0 голосов
/ 03 октября 2019

Вы должны использовать HasClaim метод, в котором вы можете передать тип заявки и значение

User.HasClaim("UserRoutes", "courses/create")
0 голосов
/ 03 октября 2019

Попробуйте:

 @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" на элемент, который вы хотите сравнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...