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

问题描述 投票:1回答:1

我不确定这里是否有最佳实践,这只是为了立即学习,因此,如果这不是最佳方法,请更正我。但是,我正在尝试创建一个我可以使用的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;
}

也没有运气。

我的想法是,我可以将该对象直接传递给View。键入这个,我想知道是否单独传递参数,然后将每个参数分配给特定ViewModel的成员可能是一个更好的主意。

这里的任何帮助将不胜感激。

谢谢!

asp.net-core-3.0 asp.net-core-viewcomponent c#-8.0
1个回答
0
投票

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

此对象可以在控制器中创建,并作为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>

对象的优点在于它可以为null,并且可以省略该对象的字段。标签中需要包含字符串参数的地方,即使为空也是如此。

当您可以将部分视图模型用作参数时,如上所示,或者当视图模型实现不同的接口并因此可以作为参数本身传递时,插入对象对于IMO也是有用的。

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

其中MyViewModel类似于:

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

public interface IPageHeaderViewComponentOptions 
{
    string pageTitle2;
}

我没有测试代码,可能会有错别字。特别是@。但是你会明白的。两种方法都行得通。

© www.soinside.com 2019 - 2024. All rights reserved.