【发布时间】:2017-03-16 16:40:12
【问题描述】:
在我的 Razor 视图中,我有一个带有 taghelper 属性的元素:
<td identity-userRole="@user.Id"></td>
这是我的标签助手:
using Hrsa.Core.Generic.Model.Lerd.Identity;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Razor.TagHelpers;
using System;
using System.Collections.Generic;
namespace Hrsa.Core.Web.App.TagHelpers
{
[HtmlTargetElement("td", Attributes = "identity-userRole")]
public class UserRolesTagHelper : TagHelper
{
private UserManager<AppUser> userManager;
private RoleManager<IdentityRole> roleManager;
public UserRolesTagHelper(UserManager<AppUser> usermgr,
RoleManager<IdentityRole> rolemgr)
{
userManager = usermgr;
roleManager = rolemgr;
}
[HtmlAttributeName("identity-userRole")]
public string User { get; set; }
public override async void Process(TagHelperContext context,
TagHelperOutput output)
{
List<string> roles = new List<string>();
AppUser user = await userManager.FindByIdAsync(User);
if (User != null)
{
foreach (var role in await userManager.GetRolesAsync(user))
{
roles.Add(role);
}
}
output.Content.SetContent(roles.Count == 0 ?
"No Roles" : String.Join(", ", roles));
}
}
}
我在 _ViewImports.cshtml 中注册了它,如下所示:
@addTagHelper Hrsa.Core.Web.App.*, Hrsa.Core.Web.App
如果我在构造函数上放置一个断点,它似乎对每个用户来说都很好并且执行得很好。 有一点跳跃,因为它是异步的,但一切似乎都建立起来了。 用户 id 是从 HTML 中的属性传递的,并且角色已准备好输出到 taghelper 中 Process 的末尾。
然后它崩溃了。
如果我通过 Cntrl F5 运行,它会说: HTTP 错误 500。
如果我调试,那么在我的第三个用户第三次点击之后,它会一直下降到:
output.Content.SetContent(roles.Count == 0 ?
"No Roles" : String.Join(", ", roles));
然后执行似乎在某个地方被吞没了。 它只是挂起。
谁能看出这有什么问题。
【问题讨论】:
-
似乎你的代码混合了用户和用户,你在使用它来获取用户后检查用户是否为空
-
User 是一个字符串属性,它由 td 属性中的 UserId 填充:
转到:"[HtmlAttributeName(" identity-userRole")] 公共字符串用户 { 获取;设置;}"。小写用户是本地声明的 AppUser :TagHelper 的覆盖进程中的 IdentityUser。 -
对,但是为什么在你已经使用它之后检查用户是否为空,应该在使用它之前检查它似乎你应该在尝试检索它之后检查用户是否为空,但是你检查用户然后
-
是的,看起来像“案例”管理的情况......
-
哦 - 它应该是小写的用户空检查。谢谢好收获。但它仍在正确地建立起来。我不知道为什么它会给出 500 错误。