C# 使用 TagHelper 将对象传递到 ViewComponent

nka*_*awn 3 asp.net-core asp.net-core-tag-helpers c#-8.0 asp.net-core-viewcomponent asp.net-core-3.0

我正在尝试创建一个ViewComponent可以与 TagHelpers 一起使用的对象,其中我传入一个对象作为参数。

\n\n

例如,我有这个ViewComponent\xe2\x80\x94 最终可能会有更多参数:

\n\n
public IViewComponentResult Invoke(string? pageTitle, string? description, string? headerView)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想做一些类似的事情:

\n\n
public class PageHeaderViewComponentOptions \n{\n    public string pageTitle2;\n    public string Description;\n}\n\npublic IViewComponentResult Invoke(PageHeaderViewComponentOptions phvc)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并像这样使用它:

\n\n
<vc:page-header phvc:page-title2="Test Title"></vc:page-header>\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,这不起作用。

\n\n

我还尝试显式设置参数类的属性信息,如下所示:

\n\n
[HtmlTargetElement("PageHeaderViewController")]\npublic class PageHeaderViewComponentOptions\n{\n    [HtmlAttributeName("page-title")]\n    public string pageTitle2 { get; set; }\n    public string Description;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

也没有运气。

\n\n

我的想法是我可以将该对象直接传递给视图。键入此内容,我想知道单独传递参数然后将每个参数分配给特定视图模型的成员是否是一个更好的主意。

\n\n

任何帮助将不胜感激。

\n

小智 7

为了添加对象作为参数,您需要传递一个对象。

该对象可以在控制器中创建并作为视图模型的一部分传递,例如:

@model MyApp.MyViewModel
Run Code Online (Sandbox Code Playgroud)

哪里MyViewModel有类似的东西:

@model MyApp.MyViewModel
Run Code Online (Sandbox Code Playgroud)

然后你像这样传递对象:

public class MyViewModel
{
    public PageHeaderViewComponentOptions PhvcOptions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

剃刀代码块内部:

@{
    var PhvcOptions = new PageHeaderViewComponentOptions
        {
            pageTitle2 = "Test Title";
        };
}
Run Code Online (Sandbox Code Playgroud)

在哪里传递对象,如下所示:

<vc:page-header phvc="PhvcOptions"></vc:page-header>
Run Code Online (Sandbox Code Playgroud)

或者甚至是内联的,看起来像这样:

@{
    var PhvcOptions = new PageHeaderViewComponentOptions
        {
            pageTitle2 = "Test Title";
        };
}
Run Code Online (Sandbox Code Playgroud)

尽管这违背了目的,但应该使用字符串输入:

<vc:page-header phvc="@PhvcOptions"></vc:page-header>
Run Code Online (Sandbox Code Playgroud)

对象的优点是它可以为空并且对象的字段可以被省略。标签中需要存在字符串参数,即使为空也是如此。

当您可以使用视图模型的一部分作为参数(如上所示)时,或者当视图模型实现不同的接口并因此可以作为参数本身传递时,插入对象在我看来也很有用:

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

哪里MyViewModel有类似的东西:

<vc:page-header pageTitle2="Test Title"></vc:page-header>
Run Code Online (Sandbox Code Playgroud)

<vc:page-header phvc="Model"></vc:page-header>
Run Code Online (Sandbox Code Playgroud)

我没有测试代码,可能有错别字。特别是与@. 但你明白了。任何一种方法都应该有效。