2016-08-29 72 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); 
} 

快樂編碼!