首页 > 解决方案 > 将控制器注入 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。

有没有更好的方法来解决这个问题?

标签: c#asp.net-coredependency-injectionasp.net-core-mvc

解决方案


您应该记住,注入 Controller 总是一个坏主意,无论在哪里。控制器应该只用于处理请求。

a 返回ViewComponent的视图是被调用的 Action 返回的视图的一部分,但它不是处理请求的控制器的直接一部分,因为ViewComponents 是可重用的。问题是您没有在 Anchor Tag Helper 中明确指定控制器名称,因此无法推断。
请记住,只有同一控制器的操作返回的视图中的标签助手不需要明确的控制器名称。因此,您可以像在控制器方法返回的视图中一样在此处生成链接,如下所示:

<a asp-contorller="Parent" asp-action="Navigate" asp-route-function="@function">@function</a>

推荐阅读