2016-11-09 4 views
4

Некоторые свойства модели содержат аннотацию данных «Обязательный», которую мне нужно прочитать в классе TagHelper.Получение атрибутов свойств в TagHelpers

public partial class Sale 
{ 
    [Required] 
    public string CustomerId { get; set; } 
    ... 

В целях реализации создать пользовательский выбор для клиента:

<customer asp-for="CustomerId " value="@Model.CustomerId"></customer> 

А в классе CustomerTagHelper есть метод процесса:

public override void Process(TagHelperContext context, TagHelperOutput output) 
{ 

Как можно обнаружить в этом point, если текущее свойство bind имеет атрибут «required»? Я использую ядро ​​asp-net.

ответ

2

Тег помощник не знает ни о чем, кроме того, что вы предоставите в качестве входных данных для его атрибутов. Итак, вы хотите создать вспомогательный тег, который можно использовать следующим образом:

@model WebApplication4.Models.Sale 
... 
<customer asp-for="CustomerId" /> 

Тогда вы бы объявить свойство типа ModelSource, связанного с атрибутом asp-for. Это даст вам доступ к не только стоимости имущества, но и метаданные, как следующее (и больше!): Значение

  • свойства: source.Model
  • Имя свойства: source.Name
  • контейнера типа модели: source.Metadata.ContainerType
  • требуется копаться флаг:source.Metadata.IsRequired

Вы также получите intellisen se в VS, чтобы выбрать одно из свойств в вашей модели для модели asp-for, и она выдает ошибку, если значение isnt не является именем свойства модели.


В качестве примера, посмотрите на этот тег помощника:

public class CustomerTagHelper: TagHelper 
{ 
    [HtmlAttributeName("asp-for")] 
    public ModelExpression Source { get; set; } 

    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     output.TagName = "p"; 
     output.TagMode = TagMode.StartTagAndEndTag; 

     var contents = [email protected]" 
      Model name: {Source.Metadata.ContainerType.FullName}<br/> 
      Property name: {Source.Name}<br/> 
      Current Value: {Source.Model}<br/> 
      Is Required: {Source.Metadata.IsRequired}"; 

     output.Content.SetHtmlContent(new HtmlString(contents)); 
    } 
} 

Тогда, если бы эти 2 модели:

public class Sale 
{ 
    [Required] 
    public string CustomerId { get; set; } 
} 
public class Promotion 
{   
    public string CustomerId { get; set; } 
} 

, которые используются в этих 2-х действиях и взглядов :

public IActionResult Sale() 
{ 
    return View(); 
} 

@model WebApplication4.Models.Sale 
... 
<customer asp-for="CustomerId" /> 


public IActionResult Promotion() 
{ 
    return View(new Models.Promotion { CustomerId = "abc-123" }); 
} 

@model WebApplication4.Models.Promotion 
... 
<customer asp-for="CustomerId" /> 

Производит эти Выходы:

Tag helper for: WebApplication4.Models.Sale 
Property name: CustomerId 
Current Value: 
Is Required: True 

Model name: WebApplication4.Models.Promotion 
Property name: CustomerId 
Current Value: abc-123 
Is Required: False 
+0

Вместо «Source.Metadata.IsRequired» Я использую «For.Metadata.IsRequired». Работает. – Beetlejuice

+0

Да, какое бы имя вы не использовали fpr свойство типа 'ModelExpression' –

+0

Как насчет доступа к другим атрибутам? – HamedH

0

Вы можете сделать это следующим образом:

var type = typeof(YOUR_CLASS); 
    var property = type.GetProperty("FIELD_NAME"); 
    var isRequired = Attribute.IsDefined(property, typeof(Required)); 
0

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

public class CustomTagHelper : TagHelper 
{ 
    [HtmlAttributeName("asp-for")] 
    public ModelExpression For { get; set; } 

    public override void Process(TagHelperContext context, TagHelperOutput output) 
    {    
     CustomAttribute attribute = For.Metadata 
             .ContainerType 
             .GetProperty(For.Name) 
             .GetCustomAttribute(typeof(CustomAttribute)) 
             as CustomAttribute; 
     if (attribute != null) 
     { 
      output.Attributes.Add("some-attr", attribute.Text); 
     } 
    } 
} 

А затем просто использовать его в шаблоне <custom asp-for="SomeProp"></custom>.

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