Hinzufügen die neue Eigenschaft zu MVC ModelMetadata
Sehe ich alternative Ansätze wie AdditionalValues, aber ich Frage mich, ob es möglich ist, um am Ende in einem Szenario, in dem Sie hinzufügen können, eine neue Eigenschaft, um die ModelMetadata Objekt in template-Ansichten.
Zum Beispiel könnten Sie haben:
@ViewData.ModelMetadata.MvvmBound
Möchte ich diese im Editor und Anzeigen-Vorlagen hinzufügen MVVM-Attribute der HTML-Elemente ausgegeben werden.
Ich bin völlig verloren, aber hier sind meine bisherigen Bemühungen:
public class MyModelMetaDataProvider : DataAnnotationsModelMetadataProvider
{
protected new MyModelMetaData CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
ModelMetadata modelMetaData = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
MyModelMetaData myMetaData = (MyModelMetaData)modelMetaData;
return myMetaData;
}
}
public class MyModelMetaData: ModelMetadata
{
public MyModelMetaData(ModelMetadataProvider provider, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
: base(provider, containerType, modelAccessor, modelType, propertyName)
{
}
public int MyProperty { get; set; }
}
Dann in der global asax, die ich benutze:
ModelMetadataProviders.Current =new MyModelMetaDataProvider();
Das problem ist, wenn ich versuche, mit MyProperty in der Ansicht, das nicht erkannt wird, was ich erwartete, weil VS ist nicht bewusst, dass der benutzerdefinierte ModelMetadata Klasse.
Ich bin mir auch nicht sicher, dass dies möglich ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein Wörterbuch
AdditionalValues
imModelMetadata
Klasse. Ref hierKönnen Sie Werte hinzufügen, um das Wörterbuch mit der
AdditionalMetadata
- Attribut, wie in:Und Sie könnte prüfen, diejenigen, die in einem
string
- editor-Vorlage, zum Beispiel:Möglicherweise möchten Sie auch zu prüfen, werden diese Attribute in der editor-Vorlage für
DummyModel
, die Sie tun können, abrufen der Metadaten für die einzelnen Eigenschaften, wie in:Gibt es einige Nachteile dieser code, wie es ist. Der Ansatz erfordert, übergeben die Schlüssel name der AdditionalValues Wörterbuch und müssen Sie auch zum cast der Wert von Objekt zu dem richtigen Typ. Könnte man erstellen Sie Ihre eigenen extension-Methode zum abrufen der Wert aus den Metadaten ohne die Notwendigkeit, manuell geben Sie den Namen für den Schlüssel ein und führen Sie einen manuellen casting:
Damit Sie einen saubereren code in das editor-Vorlagen. Zum Beispiel in einem editor Vorlage für die
DummyModel
vor, Sie könnten etwas tun möchten (vergessen Sie nicht, fügen Sie den namespace der extension-Methode auf das Web.config-Datei in /Views-Ordner):Könnten Sie paar, das extension-Methode mit benutzerdefinierten Attribut erweitern
IMetadataAware
so brauchen Sie nicht zu fest die Namen des Schlüssels der Metadaten-Wert jedes mal, wenn Sie es auf eine Eigenschaft:Weil
ModelMetadata.AdditionalValues
ist einDictionary<string,object>
Sie sind nicht beschränkt auf die Speicherung eines einfachen Wert pro Schlüssel. Sie können Folgen Sie den obigen code erstellen Sie eine eigene Klasse, die alle Eigenschaften, die Sie benötigen, ein Attribut, das Sie verwenden können, um jede dieser Werte und speichert eine Instanz der Klasse, zu der AdditionalValues Wörterbuch und eine Erweiterung Methode, extrahiert die Instanz der Klasse aus dem Wörterbuch.Wie Sie sehen, können Sie gehen ziemlich weit, ohne die Notwendigkeit für die eigene
ModelMetadata
Klasse oder die Verlängerung derModelMetadataProvider
.Hoffe, es hilft!