获取Tag Helper中的属性名称

时间:2016-08-29 07:43:47

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

ASP.NET Core引入了自定义标记帮助程序,可以在以下视图中使用:

sleep 1

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

<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" 代码帮助程序中执行相同操作?

3 个答案:

答案 0 :(得分:4)

要获取媒体资源名称,您应该在班级中使用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);
    }
}

答案 1 :(得分:1)

您可以通过标记帮助程序属性传递字符串。

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

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

答案 2 :(得分:0)

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

您可以使用任何自定义属性从视图传入当前模型。请参阅下面的示例。 假设您的模型为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);
}

快乐的编码!