2016-08-29 5 views
2

ASP.NET Ядро представила собственные хелперы тегов, которые могут быть использованы в представлениях, как это:Получить имя свойства Tag Helper

<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

Вы можете передать строку через атрибут helper атрибута.

<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

Работает для меня. Не забывайте добавлять атрибут «для» к тегу TagHelper в режиме Razor. –

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> 

Вы можете получить его i 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); 
} 

Счастливое кодирование!

Смежные вопросы