asp.net-core - C# 使用 TagHelper 将对象传递到 ViewComponent

标签 asp.net-core asp.net-core-3.0 c#-8.0 asp.net-core-tag-helpers asp.net-core-viewcomponent

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

因此,例如,我有这个 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 。输入这个,我想知道单独传递参数然后将每个参数分配给特定 View 模型的成员是否是一个更好的主意。

如有任何帮助,我们将不胜感激。

最佳答案

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

这个对象可以在 Controller 中创建并作为 View 模型的一部分传递,例如:

@model MyApp.MyViewModel

MyViewModel 是这样的:

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

然后你像这样传递对象:

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

Razor 代码块内部:

@{
    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>

对象的优点是它可以为空并且可以省略对象的字段。标签中需要出现字符串参数的地方,即使是空的。

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

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

MyViewModel 是这样的:

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

public interface IPageHeaderViewComponentOptions 
{
    string pageTitle2;
}

我没有测试代码,可能有错别字。尤其是 @。但是你明白了。两种方法都应该有效。

关于asp.net-core - C# 使用 TagHelper 将对象传递到 ViewComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58212599/

相关文章:

c# - 使用 nameof() 获取 ModelState.AddModelError() 的属性路径

asp.net-core - 通过 AddIdentityServer 将声明添加到 IdentityServer 设置

c# - ConfigurationModel 和强类型配置

c# - 从 byte[] 返回一个 FileResult

c# - C# 8 中的范围和索引类型是什么?

c# - 如何调用默认方法而不是具体实现

c# - onclick 方法在 Blazor 服务器端 Razor 组件中不起作用

c# - ASP.NET Core 3.0 [FromBody] 字符串内容返回 "The JSON value could not be converted to System.String."

c# - .Net Core Integration TestServer 与 Generic IHostBuilder

razor-pages - 您可以在 Razor 页面中使用 IAsyncEnumerable 来逐步显示标记吗?