2015-05-21 16 views
8

Tôi đang làm việc trên một dự án có số lượng lớn bảng dữ liệu và hiển thị chúng thông qua màn hình ASP.net MVC.Tự động tạo chú thích dữ liệu từ trường tên trường hợp lạc đà

tôi thấy mình viết rất nhiều chú thích dữ liệu đơn giản như thế này:

[Display(Name = "Manager Name")] 
public string ManagerName { get; set; } 

[Display(Name = "Employee Name")] 
public string EmployeeName { get; set; } 

[Display(Name = "Employee No")] 
public string EmployeeNo { get; set; } 

[Display(Name = "Manager Employee No")] 
public string ManagerEmployeeNo { get; set; } 

này là nhận được khá tẻ nhạt và đã tự hỏi nếu có một cách mà tôi có thể thêm một thuộc tính mới nói rằng "convertFromCamel" (hoặc một cái gì đó) hoặc có cách để ghi đè

@Html.DisplayNameFor(m => Model.First().EmployeeNo) 

Vì vậy nếu không có chú thích dữ liệu, nó sẽ chuyển đổi tên trường hiện tại từ trường hợp lạc đà.

cảm ơn trước

+2

của nó không phải là một chú thích dữ liệu bạn cần, một DataAnnotationsModelMetadataProvider tùy chỉnh của nó ở đâu bạn ghi đè 'CreateMetadata()' để đặt thuộc tính ModelMetatdata.DisplayName –

Trả lời

9

Sử dụng một sự kết hợp của các thông tin tìm thấy trên blog here, và lạc đà hợp cụ tuyệt vời chia regex here, tôi đã có thể làm việc này ra. Khái niệm là bạn tạo ra một hương vị tùy chỉnh của mặc định DataAnnotationsModelMetadataProvider. Trong trường hợp một thuộc tính không có tên hiển thị, nhà cung cấp tùy chỉnh này sẽ khởi động và tạo một tên cho bạn (có dấu cách).

Đầu tiên, tạo một lớp:

using System; 
using System.ComponentModel; 
using System.Text.RegularExpressions; 
using System.Web.Mvc; 

namespace MyProject.Whatever 
{ 
    public class CustomDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider 
    { 
     protected override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, PropertyDescriptor propertyDescriptor) 
     { 
      ModelMetadata metadata = base.GetMetadataForProperty(modelAccessor, containerType, propertyDescriptor); 
      if (metadata.DisplayName == null) 
      { 
       metadata.DisplayName = SplitCamelCase(metadata.GetDisplayName()); 
      } 
      return metadata; 
     } 

     private string SplitCamelCase(string str) 
     { 
      return Regex.Replace(
       Regex.Replace(
        str, 
        @"(\P{Ll})(\P{Ll}\p{Ll})", 
        "$1 $2" 
       ), 
       @"(\p{Ll})(\P{Ll})", 
       "$1 $2" 
      ); 
     } 
    } 
} 

Bây giờ ghi đè mặc định DataAnnotationsModelMetadataProvider trong tập tin Global.asax.cs của bạn bằng cách làm như sau:

protected void Application_Start() 
{ 
    //Other stuff. 
    ... 
    ModelMetadataProviders.Current = new CustomDataAnnotationsModelMetadataProvider(); 
} 
+0

Cảm ơn Jamie. Tôi sẽ cố gắng thử vào ngày hôm sau. chúc mừng – Lobsterpants

+0

@Chris - Không sao, hy vọng nó hoạt động cho bạn. Hãy cho tôi biết làm thế nào bạn nhận được trên. –

+0

cảm ơn vì điều này nhưng tôi nhận được Không thể chuyển đổi hoàn toàn loại 'CustomDataAnnotationsModelMetadataProvider' thành 'System.Web.Mvc.ModelMetadataProvider' – Lobsterpants

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