使用asp-page TagHelper时链接无法呈现

时间:2018-04-17 23:53:35

标签: c# asp.net-core-2.0 razor-pages asp.net-core-tag-helpers

使用 asp-page TagHelper时,我有一个页面无法在HTML中呈现链接。我以前见过这个,但这是由于一个错字或页面不存在。

在下面的_Layout中的两个链接中,

  • 用户呈现为http://localhost/ReportGroups/Admin/Users
  • 角色呈现为http://localhost/ReportGroups
  • 手动导航到角色会导致404错误。

_Layout.cshtml

该链接是管理员菜单的一部分。注释掉的FontAwesome图标是我测试的一部分。 /Admin/Users工作正常,但/Admin/RoleList不起作用。它之前是/Admin/Roles但是我在部分内容中构建了一个新的文件副本,以查看是否有任何错误,或者它是否为保留字。

@if (User.Identity.IsAuthenticated)
{
    if (User.IsInRole("Admin"))
    {
        <div id="nav-admin">
            <ul>
                <li><a asp-page="/Admin/Users"> Users</a></li>@*< i class="fas fa-user-secret" title="Users"></i>*@
                <li><a asp-page="/Admin/RoleList"> Roles</a></li>
                @*<i class="fas fa-id-card" title="Roles"></i>*@
            </ul>
        </div>
    }
}

RoleList.cshtml

@page "{roleId}/{userId}"
@model RoleListModel
@{
    ViewData["PageTitle"] = "Admin Tools - Roles";
    ViewData["IconClass"] = "";
    ViewData["IconTitle"] = "Roles";
}

<table>
    <thead>
        <tr>
            <th>Role</th>
            <th>User Name</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>&nbsp;</th>
        </tr>
    </thead>
    <tbody>
        @foreach (ApplicationRole role in Model.AppRoles)
        {

            <tr>
                <td colspan="4"><strong>@role.Name</strong></td>
                <td>
                    <a asp-page="/App/RoleEdit" asp-route-roleId="@role.Id"><i class="fas fa-edit"></i></a>
                </td>
            </tr>

            IList<ApplicationUser> usersOfRole = Model.AppRoleUsersDict[role];
            foreach (ApplicationUser user in usersOfRole)
            {
                <tr>
                    <td>@role.Name</td>
                    <td>@user.UserName</td>
                    <td>@user.FirstName</td>
                    <td>@user.LastName</td>
                    <td>
                        <form method="post" asp-page-handler="delete">
                            <button type="submit" asp-page="/App/GroupEdit" asp-page-handler="delete" asp-route-roleId="@role.Id" asp-route-userId="@user.Id">
                                <i class="fas fa-trash-alt" style="color:red"></i>
                            </button>
                        </form>
                    </td>
                </tr>
            }
        }

    </tbody>
</table>

RoleList.cshtml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Ctrack.ReportGroups.Data;
using Ctrack.ReportGroups.Identity;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace Ctrack.ReportGroups.Pages
{
    public class RoleListModel : PageModel
    {
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly RoleManager<ApplicationRole> _roleManager;
        private readonly ApplicationDbContext _db;

        public RoleListModel(
            ApplicationDbContext db,
            UserManager<ApplicationUser> userManager,
            RoleManager<ApplicationRole> roleManager)
        {
            _db = db;
            _userManager = userManager;
            _roleManager = roleManager;
        }

        public IList<ApplicationRole> AppRoles { get; set; }

        public IDictionary<ApplicationRole, IList<ApplicationUser>> AppRoleUsersDict { get; set; }

        /// <summary>
        /// List all Roles, and the Users assigned to them.  Exposes a form to delete the relationship for each user.
        /// </summary>
        /// <returns>Task&gt;IActionResult&gt;</returns>
        public async Task<IActionResult> OnGetAsync()
        {

            AppRoles = _roleManager.Roles.ToList();
            AppRoleUsersDict = new Dictionary<ApplicationRole, IList<ApplicationUser>>();

            foreach (ApplicationRole role in AppRoles)
            {
                IList<ApplicationUser> usersOfRole = await _userManager.GetUsersInRoleAsync(role.Name);
                AppRoleUsersDict.Add(role, usersOfRole);
            }

            return Page();
        }

        /// <summary>
        /// Removes a role from a User
        /// </summary>
        /// <param name="roleId"><see langword="string"/> containing RoleId</param>
        /// <param name="userId"><see langword="string"/> containing UserId</param>
        /// <returns>Task&gt;IActionResult&gt;</returns>
        public async Task<IActionResult> OnPostDeleteAsync(string roleId, string userId)
        {
            ApplicationUser user = await _userManager.FindByIdAsync(userId);
            ApplicationRole role = await _roleManager.FindByIdAsync(roleId);

            try
            {
                await _userManager.RemoveFromRoleAsync(user, role.Name);
                TempData["Notification"] = $"Successfully removed Role {role.Name} from User {user.UserName}.";
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = $"Exception {ex.GetType()} encountered while removing Role {role.Name} from User {user.UserName}.";
            }
            return Page();
        }
    }
}

_ViewImports.cshtml

@using Microsoft.AspNetCore.Identity
@using CtrackReportGroupsRtca
@using Ctrack.ReportGroups.Data
@using Ctrack.ReportGroups.Identity
@using System.Security.Claims
@using Microsoft.AspNetCore.Html;
@namespace Ctrack.ReportGroups.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

4 个答案:

答案 0 :(得分:2)

它不起作用的原因是您尚未定义roleId和userId值。将您的链接更改为以下内容:

<a asp-page="/Admin/RoleList" asp-route-roleId="YourRoleID" asp-route-userId="YourUserID"> Roles</a>

答案 1 :(得分:1)

我正在使用.NET Core 2.2,并且遇到了类似的问题。我通过使用

对其进行了修复
asp-page="/ThePage/Index"

代替

asp-page="/ThePage"

这可能掩盖了另一个根本问题。

答案 2 :(得分:0)

就我而言,我忘记在页面顶部添加@page指令:

@page

<h1>Hello, world!</h1>

答案 3 :(得分:0)

将此代码包含在您当前的 _ViewImports.cshtml 中,帮我解决!

@addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers