Stark typisierte generische Attributalternativen

9

Beginnen wir mit einem einfachen View-Modell:

%Vor%

Eine Dropdown-Liste könnte folgendermaßen aussehen:

%Vor%

Da eine Dropdown-Liste jedoch zwei Werte benötigt, kann sie nicht wie folgt verwendet werden:

%Vor%

mit einer Sicht, die Folgendes enthält:

%Vor%

Da es keinen inhärenten Weg gibt, das Drop-Down die Quelle zu kennen, bis Sie von UIHint:

losfahren %Vor%

Dann könnte man es wie folgt verwenden:

%Vor%

Allerdings ist dies nicht wirklich stark typisiert, jemand benennt eine der Zauberzeichenfolgen oder Propery-Namen, ohne den anderen zu ändern, und es bricht zur Laufzeit.

Eine theoretische Lösung besteht darin, ein generisches Attribut zu erstellen:

%Vor%

und die Verwendung wäre:

%Vor%

Aber (zur Zeit) generische Attribute sind nicht erlaubt : /

Eine weitere Option besteht darin, die beiden in eine einzige Klasse zu kapseln, die der ModelBinder auf dem Post-Back-System neu erstellen kann:

%Vor%

Dies schafft Einfachheit in den Vorlagen ViewModel, Binding und EditFor / DisplayFor, aber aufgrund meiner begrenzten Kenntnisse von AutoMapper fügt es Komplexität hinzu, wenn AutoMapper Zuordnung zu Eigenschaften von Klasseneigenschaften . Soweit ich weiß kann ich nicht einfach:

%Vor%

Gibt es einen einfacheren Weg mit AutoMapper, diese Werte automatisch zu mappen oder gibt es eine Möglichkeit, ein stark typisiertes nicht-generisches Attribut zu erstellen?

    
Erik Philips 13.05.2015, 21:19
quelle

2 Antworten

1

Damit der Eigenschaftsname stark typisiert wird, könnten Sie nameof verwenden, das in C # 6 eingeführt wird.

nameof ist ein Ausdruck wie typeof , aber anstatt den Typ des Werts zurückzugeben, wird der Wert als String zurückgegeben.

  

Wird verwendet, um den einfachen (nicht qualifizierten) Zeichenfolgennamen einer Variablen, eines Typs oder eines Elements zu erhalten. Wenn Sie Fehler im Code melden, MVC-Verbindungen (Model-View-Controller) verbinden, Eigenschaften ändern, Ereignisse auslösen usw., möchten Sie oft den String-Namen einer Methode erfassen. Die Verwendung von nameof trägt dazu bei, dass Ihr Code beim Umbenennen von Definitionen gültig bleibt.

%Vor%     
Waaghals 03.04.2017 13:21
quelle
0

Sie könnten Ihre Eigenschaft in Planeten als "PlanetSelectedValue" benennen, was dazu führen würde, dass AutoMapper automatisch bestimmt, welcher Wert dorthin geht. (d. h. Planet.SelectedValue entspricht PlanetSelectedValue)

Dies ist ähnlich wie bei dem Problem mit der magischen Zeichenfolge, wenn Sie den Eigenschaftsnamen ändern, AutoMapper wird nicht mehr wissen, wo er diesen Wert setzen soll, aber das ist nicht anders als bei jedem anderen AutoMapper-Problem.

%Vor%

ODER:

Verwenden Sie das IgnoreMap-Attribut von AutoMapper, um die DropDownListTemplate-Eigenschaft zu ignorieren und eine separate AutoMapper-freundliche PlanetId-Eigenschaft zu erstellen, die die Werte in der Dropdown-Listendatei manipuliert.

%Vor%

Wenn es für Ihr Projekt auch möglich ist, sehen Sie sich den c # 6.0-Namen des Ausdrucks () an, um den Namen einer Eigenschaft ohne Verwendung der magischen Zeichenfolge einzutragen.

    
Grax 14.05.2015 18:12
quelle