【问题标题】:Is it considered bad practice to inject a controller into a view component in asp.net core?将控制器注入 asp.net 核心中的视图组件是否被认为是不好的做法?
【发布时间】:2019-06-15 10:11:04
【问题描述】:

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

我尝试使用@Url.Action("Method", "Controller", new { param = "param" }) helper 来生成链接,但是在视图组件中,这个 helper 不知道如何正确生成这个 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,不管在哪里,你都做错了。为什么这里还需要一个 ViewComponent?
  • 那里有一些额外的业务逻辑(这里的示例代码不包括在内,因为它不相关)这似乎使它非常适合视图组件。这个类有一个职责——生成正确的链接供用户点击。
  • 然后将该逻辑提取到它自己的服务中并将其注入到组件中。
  • 只有&lt;a asp-action="ActionName" asp-controller="ControllerName"&gt;link text&lt;/a&gt;(请注意,您的示例中缺少控制器)
  • @TanvirArjel 我上次发表评论后就去睡觉了,所以不用担心,顺便说一句很好的答案

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 2018-08-11
    • 2015-07-24
    • 1970-01-01
    • 2011-12-01
    • 2012-01-05
    • 2017-07-28
    • 2010-11-24
    • 2013-04-12
    相关资源
    最近更新 更多