如何移除ViewComponent的命名约定识别规则或标记非ViewComponent类
解决方案
方案1:直接标记非ViewComponent(最推荐,改动最小)
对不需要被识别为ViewComponent的类,直接添加[NonViewComponent]特性即可,该特性优先级高于所有ViewComponent识别规则,添加后运行时会直接跳过该类的ViewComponent校验。
示例:
[NonViewComponent] public class ReviewComponent { // 你的业务代码 }
方案2:全局禁用命名后缀匹配规则
如果需要批量排除所有仅符合命名后缀规则的类,可以重写默认的ViewComponent描述符提供器,去掉后缀判断逻辑:
- 自定义提供器继承
DefaultViewComponentDescriptorProvider
public class CustomViewComponentDescriptorProvider : DefaultViewComponentDescriptorProvider { public CustomViewComponentDescriptorProvider(IApplicationPartManager applicationPartManager) : base(applicationPartManager) { } protected override bool IsViewComponent(TypeInfo typeInfo) { // 只保留前两条判断规则,移除名称后缀判断 return typeInfo.IsClass && typeInfo.IsPublic && !typeInfo.IsAbstract && !typeInfo.ContainsGenericParameters && // 规则1:派生自ViewComponent基类 (typeof(ViewComponent).IsAssignableFrom(typeInfo) || // 规则2:被[ViewComponent]特性修饰(含基类) typeInfo.GetCustomAttributes<ViewComponentAttribute>(inherit: true).Any()); } }
- 在Program.cs中替换默认服务
builder.Services.AddSingleton<IViewComponentDescriptorProvider, CustomViewComponentDescriptorProvider>();
额外注意
默认的第三条识别规则要求类名完整以ViewComponent为后缀,而非Component。如果你的类仅带Component后缀就被误识别,建议先排查这些类是否意外继承了ViewComponent基类、或者被误加了[ViewComponent]特性。
内容的提问来源于stack exchange,提问作者gfyans
相关产品推荐
相关产品推荐

