【问题标题】:Custom tag helper: How do I use complex objects in attributes?自定义标签助手:如何在属性中使用复杂对象?
【发布时间】:2015-09-23 15:49:28
【问题描述】:

我目前正在开发一个 ASP.NET Core 自定义标签助手。我需要从属性中读取一个复杂对象,如下所示:

[模型]

public class Page {
  [HtmlAttributeName(page-size)]
  public int size {get; set;}
}

public class MyControl {
  public Page page {get; set;}
}

[TagHelper 类]

[TargetElement("MyControl", Attributes="page-size")]
public class MyControlTagHelper : TagHelper {
  public Page page {get; set;}
  //Here i have process methods.
}

现在我想在视图中获取页面大小值,如下所示:

<MyControl page-size="4"></MyControl>

我不知道该怎么做。到目前为止,我尝试将完整的复杂对象提供给属性as shown in this article。

如何将复杂对象的值读取为page-size?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc tag-helpers


    【解决方案1】:

    您的标签助手类应如下所示:

    [TargetElement("MyControl", Attributes="page-info")]
    public class MyControlTagHelper : TagHelper {
    
      [HtmlAttributeName("page-info")]
      public Page page {get; set;}
      //Here i have process methods.
    
    }
    

    而你的查看页面如下:

    <MyControl page-info="new Page{size = 2}"></MyControl>
    

    进一步参考:

    【讨论】:

      【解决方案2】:

      从 Page 类中移除 HtmlAttributeName

      public class Page {
        public int size{ get;set; }
       }
      

      你不需要 MyControl 类

      将 HtmlAttributeName 放在 taghelper 的 PageProperty 上

      [TargetElement("MyControl", Attributes="page-info")]
      public class MyControlTagHelper : TagHelper {
      
        [HtmlAttributeName("page-info")]
        public Page page{ get;set; }
       //Here i have process methods.
       }
      

      在您的视图中放置自定义标签的标记并从您的视图模型中传入 Page 对象

      <MyControl page-info="@Model.Page"></MyControl>
      

      现在您直接在 page-info 属性上传递 Page 对象,您可以直接从 process 方法访问其成员。在 process 方法中测试它是否为 null,如果它为 null,只需设置 output.SuppressOutput();返回;

      【讨论】:

      • 感谢您的回答。但我想单独获取复杂对象中每个属性的值。有可能吗?
      • 如果您想要单独使用它们,那么您应该为 taghelper 上的每个设置创建属性,并将它们作为视图中的属性单独传递。你可以传入一个复杂的对象或多个简单的原始类型,但你不能传入一个复杂的对象并让它神奇地映射到据我所知的单独的原始类型。只传入复杂对象然后单独访问其属性(如 page.size 等)似乎更干净
      • 它可以在标签助手(asp net core 2)中传递复杂对象,这个答案必须被标记为接受。
      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 2020-02-08
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      相关资源
      最近更新 更多