2016-11-09 168 views
4

某些模型屬性具有「必需的」數據註釋,我需要在TagHelper類中讀取。在TagHelper中獲取屬性屬性

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) 
{ 

我怎樣才能發現這點,如果當前綁定屬性具有「必需」屬性?我正在使用asp-net核心。

回答

2

標籤助手不知道比你提供什麼樣的作爲其屬性輸入的任何其他。所以,你要創建一個可以使用如下標籤幫手:

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

然後,你將宣佈與asp-for屬性相關聯ModelSource類型的屬性。這將讓你訪問不只是財產的價值,而且元數據,如下面的(和更多!):

  • 屬性值:source.Model
  • 屬性名稱:source.Name
  • 容器模型類型:source.Metadata.ContainerType
  • IsRequired標誌:source.Metadata.IsRequired

您也將獲得intellisen在VS中選擇asp-for模型的模型中的一個屬性,如果該值不是模型屬性的名稱,則會引發錯誤。


舉個例子,看看這個標籤幫手:

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

這是在這兩個動作,並享有使用:

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>中使用它。