2015-05-21 69 views
8

我正在處理大量數據表的項目並通過ASP.net MVC屏幕顯示它們。自動生成來自駱駝大小寫字段名稱的數據註釋

我發現自己寫了很多簡單的數據註解的是這樣的:

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

這是已經非常乏味,想知道是否有一種方法,我可以添加一個新的屬性,上面寫着「convertFromCamel」 (或東西)或者是有沒有辦法覆蓋

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

因此,如果沒有數據註解其轉換駝情況下,現有的字段名。

在此先感謝

+2

它不是一個數據,你需要註解,其定製DataAnnotationsModelMetadataProvider哪裏你重寫'CreateMetadata()'來設置ModelMetatdata.DisplayName屬性 –

回答

9

使用的博客上here中的信息的組合,以及出色的駝峯分裂正則表達式here,我能來解決這一問題。這個概念是你創建了默認的DataAnnotationsModelMetadataProvider的自定義風格。在屬性沒有顯示名稱的情況下,此自定義提供程序會爲您創建一個(帶空格)。

首先,創建一個類:

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

現在通過執行以下操作覆蓋默認DataAnnotationsModelMetadataProviderGlobal.asax.cs文件:

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

謝謝傑米。我會在第二天左右嘗試一下。歡呼聲 – Lobsterpants

+0

@Chris - 沒問題,希望它適合你。讓我知道你是怎麼辦的。 –

+0

感謝,但我得到 無法隱式轉換類型「CustomDataAnnotationsModelMetadataProvider」到「System.Web.Mvc.ModelMetadataProvider」 – Lobsterpants

相關問題