Считается ли плохой практикой вводить контроллер в компонент вида в ядре asp.net? - PullRequest
0 голосов
/ 22 января 2019

У меня есть компонент вида, который должен выполнить некоторую логику, чтобы определить ссылки для отображения.Ссылки должны передавать некоторые параметры в содержащий контроллер, чтобы он знал, что отображать.

Я пытался использовать помощник @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 голосов
/ 22 января 2019

Вы должны иметь в виду, что введение контроллера всегда плохая идея, не важно где.Контроллеры должны быть там только для обработки запросов.

Представление, возвращаемое ViewComponent, является частью представления, возвращаемого вызываемым действием, но оно не является непосредственно частью контроллера, обрабатывающего запрос, поскольку ViewComponent s предназначены для повторного использования.Проблема заключалась в том, что вы не указали имя контроллера в помощнике по тегам привязки явно, и его нельзя определить.
Помните, что только помощники тегов в представлениях, возвращаемых действиями того же контроллера, не требуют явно имя контроллера.Таким образом, вы можете создать ссылку здесь, как в представлении, возвращаемом методом контроллера, следующим образом:

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