【问题标题】:Get property name in Tag Helper在 Tag Helper 中获取属性名称
【发布时间】:2016-08-29 07:43:47
【问题描述】:

ASP.NET Core 引入了自定义标签助手,可以在如下视图中使用:

<country-select value="CountryCode"  />

但是,我不明白如何在我的类中获取模型属性名称:

public class CountrySelectTagHelper : TagHelper
{
    [HtmlAttributeName("value")]
    public string Value { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
       ...
       // Should return property name, which is "CountryCode" in the above example
       var propertyName = ???();  
       base.Process(context, output);
    }
}

在以前的版本中,我可以通过使用ModelMetadata 来做到这一点:

var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var property = metadata.PropertyName; // return "CountryCode"

如何在新的ASP.NET 标签助手中做同样的事情?

【问题讨论】:

  • 你为什么不使用Value属性?

标签: asp.net-mvc razor asp.net-core tag-helpers


【解决方案1】:

为了获得属性名称,你应该在你的类中使用ModelExpression

public class CountrySelectTagHelper : TagHelper
{
    public ModelExpression For { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        var propertyName = For.Metadata.PropertyName;
        var value = For.Model as string;

        ...

        base.Process(context, output);
    }
}

【讨论】:

  • 为我工作。不要忘记在 Razor 视图中为 TagHelper 添加“for”属性。
【解决方案2】:

您可以通过标签助手属性传递一个字符串。

 <country-select value="@Model.CountryCode"  />

Value 属性将由 Razor 填充,其值为 Model.CountryCode,方法是在 @ 前面添加。因此,您可以直接获取值,而无需传递模型属性的名称并在之后访问它。

【讨论】:

    【解决方案3】:

    我不确定你是否得到了你想要的。如果您希望将完整的模型从视图传递给自定义标签助手,我就是这样做的。

    您可以使用任何自定义属性从视图中传入当前模型。请参见下面的示例。 假设你的模型是Country

    public class Country
    {
        public string Name { get; set; }
        public string Code { get; set; }
    
    }
    

    现在在您的自定义标签助手中声明一个相同类型的属性。

    public Country CountryModel { get; set; }
    

    你的控制器看起来像这样

    public IActionResult Index()
    {
        var country= new Country
        {
            Name = "United States",
            Code = "USA"
        };
    
        return View("Generic", country);
    }
    

    在此设置中,要在 taghelper 中访问您的模型,只需像任何其他自定义属性/属性一样将其传入

    您的视图现在应该看起来像这样

    <country-select country-model="@Model"></country-select>
    

    您可以像任何其他类属性一样在标签助手中接收它

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
       ...
       // Should return property name, which is "CountryCode" in the above example
       var propertyName = CountryModel.Name;  
       base.Process(context, output);
    }
    

    编码愉快!

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多