2015-05-21 3 views
8

Sto lavorando a un progetto con un numero enorme di tabelle di dati e visualizzandole tramite gli schermi ASP.net MVC.Generazione automatica di annotazioni di dati dai nomi dei campi dei cammelli

mi ritrovo a scrivere un sacco di semplici annotazioni di dati in questo modo:

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

Questo sta diventando abbastanza noioso e si chiedeva se c'è un modo che io possa o aggiungere un nuovo attributo che dice "convertFromCamel" (o qualcosa) o c'è un modo per ignorare

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

Così che se non v'è alcuna annotazione di dati converte il nome del campo esistente dal caso cammello.

grazie in anticipo

+2

La sua non è un'annotazione dati necessari, è un DataAnnotationsModelMetadataProvider personalizzata in cui si esegue l'override di 'CreateMetadata()' per impostare la proprietà ModelMetatdata.DisplayName –

risposta

9

utilizzando una combinazione delle informazioni che si trovano sul blog here, e l'eccellente cammello cassa divisa regex here, sono stato in grado di lavorare questo fuori. Il concetto è che si crea un aroma personalizzato di default DataAnnotationsModelMetadataProvider. Nel caso in cui una proprietà non abbia già un nome visualizzato, questo fornitore personalizzato inizia e crea uno per te (con spazi).

In primo luogo, creare una classe:

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

Ora ignorare l'impostazione predefinita DataAnnotationsModelMetadataProvider nel file Global.asax.cs effettuando le seguenti operazioni:

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

Grazie Jamie. Darò quella prova nel prossimo giorno o così. evviva – Lobsterpants

+0

@Chris - Nessun problema, spero che funzioni per te. Fammi sapere come vai. –

+0

grazie per questo, ma ho Impossibile convertire implicitamente il tipo 'CustomDataAnnotationsModelMetadataProvider' a 'System.Web.Mvc.ModelMetadataProvider' – Lobsterpants