2015-05-21 10 views
8

Ich arbeite an einem Projekt mit einer großen Anzahl von Datentabellen und zeige sie über ASP.net MVC-Bildschirme an.Automatisches Generieren von Datenanmerkungen aus camel case Feldnamen

Ich finde mich viel einfacher Daten Anmerkungen wie folgt zu schreiben:

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

Dies ist immer ziemlich langweilig und frage mich, ob es einen Weg gibt, dass ich entweder ein neues Attribut hinzufügen können, der sagt „convertFromCamel“ (oder etwas) oder ist es eine Möglichkeit,

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

zu überschreiben, damit, wenn es keine Datenaufbelichtung der vorhandenen Feldnamen aus Kamel Fall umwandelt.

Dank im Voraus

+2

Es ist nicht eine Daten Anmerkung Sie benötigen, dessen eine benutzerdefinierte DataAnnotationsModelMetadataProvider wo Sie überschreiben 'CreateMetadata()', um die ModelMetatdata.DisplayName -Eigenschaft zu setzen –

Antwort

9

eine Kombination der auf dem Blog Split regex here und die hervorragende Kamel-Fall Informationen und Verwenden von here konnte ich dieses heraus arbeiten. Das Konzept besteht darin, dass Sie eine benutzerdefinierte Variante des Standards DataAnnotationsModelMetadataProvider erstellen. Wenn eine Eigenschaft bereits keinen Anzeigenamen hat, tritt dieser benutzerdefinierte Anbieter ein und erstellt einen für Sie (mit Leerzeichen).

Erstens eine Klasse erstellen:

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

nun die Standard-DataAnnotationsModelMetadataProvider in Ihrer Global.asax.cs Datei überschreiben, indem Sie folgendermaßen vorgehen:

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

Danke Jamie. Ich werde es am nächsten Tag probieren. Prost – Lobsterpants

+0

@Chris - Kein Problem, hoffe es funktioniert für Sie. Lass mich wissen, wie es dir geht. –

+0

Dank dafür, aber ich bekomme kann nicht implizit Typ umwandeln ‚CustomDataAnnotationsModelMetadataProvider‘ zu – Lobsterpants

Verwandte Themen