在Razor Pages的_Layout.cshtml中使用自定义TagHelper时属性绑定失败
问题描述
开发了一个基于授权策略条件渲染HTML元素的自定义TagHelper,但传递策略字符串值时,TagHelper中的Policy属性始终绑定为null,同时疑问是否布局页无法使用此类TagHelper。
自定义TagHelper代码
[HtmlTargetElement(Attributes = nameof(Policy))] public class AuthorizationPolicyTagHelper : TagHelper { private readonly IAuthorizationService authorizationService; private readonly IHttpContextAccessor httpContextAccessor; public AuthorizationPolicyTagHelper(IAuthorizationService authorizationService, IHttpContextAccessor httpContextAccessor) { this.authorizationService = authorizationService; this.httpContextAccessor = httpContextAccessor; } public string Policy { get; set; } public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var user = this.httpContextAccessor.HttpContext.User; if (!user.Identity.IsAuthenticated || !(await this.authorizationService.AuthorizeAsync(user, this.Policy)).Succeeded) { output.SuppressOutput(); } } }
布局页中的使用代码
<li class="nav-item" policy="@MyConstantString"> <a asp-page="/Documents/Index" class="nav-link"> <i class="fas fa-fw fa-file"></i> <span>Documents</span> </a> </li>
排查与解决方法
检查TagHelper注册是否正确
确保在_ViewImports.cshtml文件中添加了TagHelper注册指令,布局页会继承该文件的配置。指令格式示例:@addTagHelper *, 你的程序集名称若TagHelper位于
MyWebApp程序集,则写@addTagHelper *, MyWebApp;如需单独注册该TagHelper,可写@addTagHelper MyWebApp.TagHelpers.AuthorizationPolicyTagHelper, MyWebApp。显式指定属性绑定名称
给Policy属性添加[HtmlAttributeName("policy")]特性,强制绑定HTML中的policy属性,避免命名匹配问题:[HtmlAttributeName("policy")] public string Policy { get; set; }验证常量的可访问性
- 确认
MyConstantString所在命名空间已通过@using指令引入到_ViewImports.cshtml或当前布局页中。 - 临时替换为字符串字面量测试,比如将
policy="@MyConstantString"改为policy="RequireAdmin",验证Policy属性是否能正常取值,以此排除常量本身的问题。
- 确认
布局页支持使用自定义TagHelper
布局页完全可以使用自定义TagHelper,不存在使用限制,只要注册和属性绑定配置正确即可。
内容的提问来源于stack exchange,提问作者Vincent Rutten
相关产品推荐
相关产品推荐

