2015-05-21 15 views
8

Pracuję nad projektem z ogromną liczbą tabel danych i wyświetlaniem ich na ekranach MVC ASP.net.Automatyczne generowanie adnotacji danych z nazw pól obserwacji wielbłądów

znajdę się pisać dużo prostych adnotacji danych tak:

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

To się robi dość żmudne i zastanawiałem się, czy istnieje sposób, że mogę dodać nowy atrybut, który mówi „convertFromCamel” (lub coś) czy jest jakiś sposób, aby zastąpić

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

tak, że jeśli nie ma adnotacji dane przetwarza istniejącą nazwę pola z przypadku wielbłąda.

góry dzięki

+2

jego adnotacji danych trzeba, jego własny DataAnnotationsModelMetadataProvider gdzie zastępujesz 'CreateMetadata()', aby ustawić właściwość ModelMetatdata.DisplayName. –

Odpowiedz

9

stosując kombinację informacji zawartych na blogu here i doskonała wielbłądziej Sprawa podzielonego regex here, byłem w stanie pracować na to uwagę. Koncepcja polega na tym, że tworzysz niestandardowy smak domyślnego DataAnnotationsModelMetadataProvider. W przypadku, gdy właściwość nie ma już nazwy wyświetlanej, ten niestandardowy dostawca uruchamia się i tworzy dla ciebie (ze spacjami).

Najpierw należy utworzyć klasę:

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

Teraz zastąpić domyślny DataAnnotationsModelMetadataProvider w pliku Global.asax.cs wykonując następujące czynności:

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

Dzięki Jamie. Spróbuję tego nazajutrz. Pozdrawiam – Lobsterpants

+0

@Chris - Nie ma problemu, mam nadzieję, że zadziała. Daj mi znać, jak sobie radzisz. –

+0

dzięki za to, ale mam nie można niejawnie przekonwertować typu „CustomDataAnnotationsModelMetadataProvider” do „System.Web.Mvc.ModelMetadataProvider” – Lobsterpants

Powiązane problemy