2016-10-11 4 views
0

Ich muss ein vorhandenes Objekt als eine Eigenschaft in meinem Modell verwenden, das DisplayNameAttribute nicht anwenden kann, da die Datei kompiliert wird.Aktualisieren von DisplayName ohne Attributierungseigenschaft

Dies ist ein komplexes und tiefes Objekt und dieses Muster muss wiederholt werden - ich möchte keinen Wrapper darüber erstellen, es sei denn, ich muss es unbedingt tun.

Ich glaube, die am besten geeignete Möglichkeit ist, das DisplayName-Attribut für die ModelMetadata-Klasse manuell festzulegen.

Ich habe es geschafft Eigenschaften zu finden und das Anzeigeattribut mit dem Code unten ein:

Die in der zweiten Zeile vorgenommenen Änderungen wirken sich nicht auf die „Quelle der Wahrheit“ - das heißt, jedes Mal wenn die erste Zeile wird ausgeführt DisplayName Eigenschaft auf FirstName ist auf Null festgelegt.

Wie kann ich das umgehen? Dies ist in einer normalen MVC-Methode.

Antwort

0

Sie können DataAnnotationsModelMetadataProvider außer Kraft setzen, um den DisplayName zu setzen (und alle Arten von anderen Dingen zu machen).

using System.Web.Mvc; 
public class CustomModelMetaDataProvider : DataAnnotationsModelMetadataProvider { 

    // called once for each property of the ViewModel 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) { 

     Func<IEnumerable<Attribute>, ModelMetadata> metadataFactory = attr => base.CreateMetadata(attr, containerType, modelAccessor, modelType, propertyName); 
     var metadata = metadataFactory(attributes); 

     // set DisplayName depending on ViewModel type and property name 
     if (modelType == typeof(CustomModelToOverride)) { 
      if (propertyName == "FirstName") { 
       metadata.DisplayName = "First name"; 
      } 
      else if (propertyName == "LastName") { 
       // ... 
      } 
     } 

     return metadata; 
    } 
} 

Register dieser Brauch MetaDataProvider im Global.asax.cs

protected void Application_Start() { 

    // ... 
    var metaDataProvider = new CustomModelMetaDataProvider(); 
    ModelMetadataProviders.Current = metaDataProvider; 
} 
Verwandte Themen