C # - передача объекта в ViewComponent с помощью TagHelper - PullRequest
1 голос
/ 03 октября 2019

Я не уверен в лучших практиках здесь, и это только для обучения прямо сейчас, поэтому, пожалуйста, исправьте меня, если это не лучший метод ... Но я пытаюсь создать ViewComponent, который я могуиспользовать с TagHelpers, где я передаю объект в качестве параметра.

Итак, у меня есть этот ViewComponent (который может иметь больше параметров):

public IViewComponentResult Invoke(string? pageTitle, string? description, string? headerView)

, и я хотел бы сделать что-то вроде:

public class PageHeaderViewComponentOptions 
{
    public string pageTitle2;
    public string Description;
}

public IViewComponentResult Invoke(PageHeaderViewComponentOptions phvc)

И используйте это как:

<vc:page-header phvc:page-title2="Test Title"></vc:page-header>

Но это не работает.

Я также попытался явно установить информацию об атрибутах для класса параметров следующим образом:

[HtmlTargetElement("PageHeaderViewController")]
public class PageHeaderViewComponentOptions
{
    [HtmlAttributeName("page-title")]
    public string pageTitle2 { get; set; }
    public string Description;
}

также не повезло.

Я думаю, что могу передать этот объектпрямо на вид. Вводя это, мне интересно, может быть лучше передать параметры по отдельности, а затем назначить каждый элемент определенной модели ViewModel.

Любая помощь здесь будет принята с благодарностью.

Спасибо!

1 Ответ

1 голос
/ 04 октября 2019

Чтобы добавить объект в качестве параметра, вам нужно передать объект.

Этот объект может быть создан в контроллере и передан как часть ViewModel, например:

@model MyApp.MyViewModel

где MyViewModel выглядит примерно так:

public class MyViewModel
{
    public PageHeaderViewComponentOptions PhvcOptions { get; set; }
}

Где вы передаете объект следующим образом:

<vc:page-header phvc="PhvcOptions"></vc:page-header>

внутри блока кода бритвы:

@{
    var PhvcOptions = new PageHeaderViewComponentOptions
        {
            pageTitle2 = "Test Title";
        };
}

Где вы передаете объект, как это:

<vc:page-header phvc="@PhvcOptions"></vc:page-header>

или даже встроенный, который выглядит примерно так:

<vc:page-header phvc="@(new PageHeaderViewComponentOptions { pageTitle2 = "Test Title" })"></vc:page-header>

Хотя это противоречит цели и вместо него следует использовать строковый ввод:

<vc:page-header pageTitle2="Test Title"></vc:page-header>

Преимущество объекта в том, что он может быть нулевым, а поля объекта могут быть опущены. Там, где строковые параметры должны присутствовать в теге, даже если они пустые.

Вставка объектов является ИМО, также полезна, когда вы можете использовать часть модели представления в качестве параметра, как показано выше, или когда модель представления реализует различные интерфейсыи может быть передан в качестве самого параметра:

<vc:page-header phvc="Model"></vc:page-header>

, где MyViewModel имеет вид:

public class MyViewModel : IPageHeaderViewComponentOptions 
{
    public string pageTitle2 { get; set; }
}

И

public interface IPageHeaderViewComponentOptions 
{
    string pageTitle2;
}

Я не тестировал коди там могут быть опечатки. Особенно с @. Но вы получите идею. Любой подход должен работать.

...