在asp.net核心的视图组件中注入控制器是否被认为是不好的做法?

时间:2019-01-22 00:56:08

标签: c# asp.net-core dependency-injection asp.net-core-mvc

我有一个视图组件,需要执行一些逻辑来确定要显示的某些链接。链接需要将一些参数传递给包含的控制器,以便它知道要显示什么。

我尝试使用@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。

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

1 个答案:

答案 0 :(得分:2)

您应该记住,注入Controller始终是一个坏主意,与在哪里无关紧要。控制器应该只在那里处理请求。

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

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