【发布时间】: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?
-
那里有一些额外的业务逻辑(这里的示例代码不包括在内,因为它不相关)这似乎使它非常适合视图组件。这个类有一个职责——生成正确的链接供用户点击。
-
然后将该逻辑提取到它自己的服务中并将其注入到组件中。
-
只有
<a asp-action="ActionName" asp-controller="ControllerName">link text</a>(请注意,您的示例中缺少控制器) -
@TanvirArjel 我上次发表评论后就去睡觉了,所以不用担心,顺便说一句很好的答案
标签: c# asp.net-core dependency-injection asp.net-core-mvc