2017-03-16 62 views
0

在我的Razor视图我有我的taghelper属性的元素:为什么我的自定义标签帮助器崩溃?

<td identity-userRole="@user.Id"></td> 

这里是我的taghelper:

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 

如果我在构造函数上放置了一个断点,它似乎对每个用户来说都是非常棒的。 有一点点跳跃,因为它是异步的,但一切似乎都建立好了。 用户标识是从HTML中的属性传递的,并且角色已准备好输出到标签帮助程序的结尾处。

但后来它崩溃。

如果我通过CNTRL F5运行,它说: HTTP错误500

如果我三分命中为我的第三个用户后调试然后它一路下跌到:

output.Content.SetContent(roles.Count == 0 ? 
      "No Roles" : String.Join(", ", roles)); 

然后执行似乎被吞噬了某处。 它只是挂起。

任何人都可以看到这个错误。

+0

好像也许你的代码混合用户和用户,检查用户是否是用它来获得用户 –

+0

用户后空是一个字符串属性并且用td属性填充UserId: 转到:“[HtmlAttributeName(”identity-userRole“)] public string User {get; set; }”。 小写用户是一个本地声明的AppUser:IdentityUser,覆盖了TagHelper的Process。 – Sam

+0

正确,但是为什么在你已经使用它之后检查用户是否为空,在使用它之前应该检查并且好像你应该检查用户在尝试检索它之后是否为空,而是你检查用户然后 –

回答

0

我改变:

public override async void Process(TagHelperContext context, 
     TagHelperOutput output) 

到:

public override async Task ProcessAsync(TagHelperContext context, 
     TagHelperOutput output)