2016-08-29 70 views
2

ASP.NET的核心引入了可以在视图中使用这样的自定义标签助手:获取属性名

<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标签助手中做同样的事情?

+0

为什么不使用'Value'属性? –

回答

1

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

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

Value属性将通过用剃刀的Model.CountryCode值通过预先@填充。所以你可以直接获取值,而不需要传递模型属性的名称并在之后访问。

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); 
    } 
} 
+0

适合我。不要忘记在Razor视图中为TagHelper添加“for”属性。 –

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> 

你可以接收它我n您的标签助手像任何其他类属性

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); 
} 

快乐编码!