2012-06-10 33 views
23

Tôi đã tạo HtmlHelper trong asp.net mvc 4 công cụ xem dao cạo C#.Truy cập các thuộc tính từ Trình trợ giúp tùy chỉnh Html trong asp.net mvc 4 dao cạo

Tôi có thể chuyển thuộc tính mô hình xem cho lớp trợ giúp của mình không?

Ví dụ, tôi có tài sản

[Required] 
[Display(Name = "Your Lastname")] 
public string Lastname { get; set; } 

Tôi có thể vượt qua bất động sản này để một cái gì đó giúp đỡ tôi như thế này @ Html.Example (mô hình => model.Lastname) và hơn được anotations dữ liệu trong helper (nếu điều này trường được yêu cầu tên hiển thị và vv) là gì?

Cảm ơn

Trả lời

38

Thuộc tính [Display] làm phong phú thêm siêu dữ liệu. Vì vậy, bạn có thể lấy thông tin từ siêu dữ liệu.

Ví dụ, nếu bạn muốn lấy lại tên hiển thị bên trong helper:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     var displayName = metadata.DisplayName; 
     return new HtmlString(html.Encode(displayName)); 
    } 
} 

và sau đó nếu chúng ta giả định rằng bạn có một mô hình điểm:

public class MyViewModel 
{ 
    [Required] 
    [Display(Name = "Your Lastname")] 
    public string Lastname { get; set; } 
} 

bạn có thể sử dụng các helper trong chế độ xem được nhập mạnh mẽ của bạn:

@model MyViewModel 

@Html.Example(x => x.Lastname) 

Bây giờ, giả sử bạn đã viết siêu dữ liệu tùy chỉnh tại tri ân:

public class FooBarAttribute : Attribute, IMetadataAware 
{ 
    public FooBarAttribute(string bar) 
    { 
     Bar = bar; 
    } 
    public string Bar { get; private set; } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["foo"] = Bar; 
    } 
} 

mà bạn sử dụng để trang trí mô hình của bạn với:

public class MyViewModel 
{ 
    [Required] 
    [FooBar("This is the bar")] 
    public string SomeBar { get; set; } 
} 

và sau đó bên trong helper của bạn, bạn có thể lấy các thuộc tính tùy chỉnh:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("foo")) 
     { 
      var foo = metadata.AdditionalValues["foo"] as string; 
      return new HtmlString(html.Encode(foo)); 
     } 
     return MvcHtmlString.Empty; 
    } 
} 

UPDATE:

Dường như bạn n eed để tìm nạp thông điệp Bắt buộc. Không biết tại sao bạn cần làm điều này trong trình trợ giúp tùy chỉnh nhưng đây là ví dụ về cách bạn có thể đạt được điều đó:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var me = (ex.Body as MemberExpression); 
     if (me != null) 
     { 
      var required = me 
       .Member 
       .GetCustomAttributes(typeof(RequiredAttribute), false) 
       .Cast<RequiredAttribute>() 
       .FirstOrDefault(); 
      if (required != null) 
      { 
       var msg = required.FormatErrorMessage(me.Member.Name); 
       return new HtmlString(html.Encode(msg)); 
      } 
     } 
     return MvcHtmlString.Empty; 
    } 
} 
+2

Wow. Tôi nghĩ bạn rất tuyệt vời :) Cảm ơn bạn –

+0

và bạn có thể nói làm thế nào tôi có thể tìm thấy dữ liệu-val-yêu cầu tin nhắn? tôi muốn nhận được messagess này >>> data-val-date = "Trường Ngày sinh phải là một ngày." data-val-required = "Trường ngày sinh là bắt buộc. –

+0

' dữ liệu-val-required' là thuộc tính phía máy khách.Tôi đoán bạn muốn tìm nạp thông điệp được sử dụng bởi thuộc tính Bắt buộc. Tôi sẽ cập nhật câu trả lời của mình bằng một Ví dụ: –

Các vấn đề liên quan