c# - 将控制器注入 asp.net 核心中的视图组件是否被认为是不好的做法?
问题描述
我有一个视图组件需要执行一些逻辑来确定要显示的一些链接。链接需要将一些参数传递给包含的控制器,以便它知道要显示什么。
我尝试使用@Url.Action("Method", "Controller", new { param = "param" })
帮助器生成链接,但在视图组件内部,该帮助器不知道如何正确生成此 URL。
相反,在我的 Default.cshtml 中,我正在生成这样的链接:
<a asp-action="Navigate" asp-route-function="@function">@function</a>
我已将包含视图的控制器注入到视图组件中,并在视图组件中使用以下代码:
public class FunctionSelectorViewComponent : ViewComponent
{
private readonly ParentController parentController;
public FunctionSelectorViewComponent(ParentController parentController)
{
this.parentController = parentController;
}
public IActionResult Navigate(string function)
{
return this.parentController.Navigate(function);
}
}
这种方法可行,但感觉有点糟糕,因为它使 ViewComponent 类依赖于 parentController。
有没有更好的方法来解决这个问题?
解决方案
您应该记住,注入 Controller 总是一个坏主意,无论在哪里。控制器应该只用于处理请求。
a 返回ViewComponent
的视图是被调用的 Action 返回的视图的一部分,但它不是处理请求的控制器的直接一部分,因为ViewComponent
s 是可重用的。问题是您没有在 Anchor Tag Helper 中明确指定控制器名称,因此无法推断。
请记住,只有同一控制器的操作返回的视图中的标签助手不需要明确的控制器名称。因此,您可以像在控制器方法返回的视图中一样在此处生成链接,如下所示:
<a asp-contorller="Parent" asp-action="Navigate" asp-route-function="@function">@function</a>
推荐阅读
- ubuntu - 从远程将命令注入正在运行的 Minecraft 服务器
- macos - 使用 FileWrapper 创建自定义文档类型
- sublimetext3 - Sublime Text 将行号分配给变量?
- python - 如何在python中重命名sqlite列?
- amazon-web-services - UTF-16LE能不能转成MySQL LOAD DATA INFILE类型格式而不乱码中文等语言?如果有怎么办?
- javascript - 我可以在我的代码中更改什么来提取第一个数字?
- python - 使用 Django 发送电子邮件以联系
- c++ - 在 C++ 中的写入系统调用中发送动态数组的问题
- mysql - 使用多个 IN 子句查询多对多关系
- javascript - 如何将表格分成两部分以需要不同的输入