ASP.NET Core中ViewComponent能否仅保留视图文件移除组件类?
能否移除ASP.NET Core ViewComponent的组件类仅保留视图文件?
我在ASP.NET Core项目里有个简单的ViewComponent,放在/Views/Shared/Components/DisclosureCard目录下,当前包含Default.cshtml和DisclosureCardViewComponent.cs两个文件,组件类代码如下:
public class DisclosureCardViewComponent : ViewComponent { public IViewComponentResult Invoke(DisclosureCardViewModel disclosureCardViewModel) => View(disclosureCardViewModel); }
我觉得这个组件类就是个多余的“中转”,想知道能不能删掉DisclosureCardViewComponent.cs只留Default.cshtml?
当我试着不用组件类,调用@await Component.InvokeAsync("DisclosureCard", disclosureCardViewModel)时,抛出了如下异常:
System.InvalidOperationException: 找不到名为“DisclosureCard”的视图组件。视图组件必须是公共的非抽象类,不能包含任何泛型参数,且必须要么用“ViewComponentAttribute”特性修饰,要么类名以“ViewComponent”后缀结尾。视图组件不得用“NonViewComponentAttribute”特性修饰。
结论与解决方案
不能直接移除组件类——ASP.NET Core的ViewComponent机制要求必须存在符合约定的组件类才能被识别,它是框架定位和调用组件的核心入口,哪怕这个类只是单纯传递模型渲染视图。
不过你可以根据需求做两种处理:
- 简化组件类:如果不想写太多代码,可以保持你现在的极简写法,完全不影响功能,也不会有冗余代码。
- 改用局部视图替代:如果彻底不想保留组件类,局部视图是更合适的方案:
- 把
Default.cshtml移动到局部视图目录,比如/Views/Shared/Partials/DisclosureCard.cshtml - 调用时替换成局部视图的调用方式:
或者用更简洁的标记帮助器:@await Html.PartialAsync("~/Views/Shared/Partials/DisclosureCard.cshtml", disclosureCardViewModel)<partial name="~/Views/Shared/Partials/DisclosureCard.cshtml" model="disclosureCardViewModel" />
- 把
内容的提问来源于stack exchange,提问作者Andvik
相关产品推荐
相关产品推荐

