2017-05-23 25 views
0

Bisher habe ich soemthing wie dieses:in benutzerdefinierten Wert hinzufügen HTML.EnumDropDownListFor

public enum MyEnum 
{ 
    [Display(Name="FirstElement")] 
    element1 = 1, 
    [Display(Name="SecondElement")] 
    element2 = 2 
} 

Und in der Ansicht, wenn ich benutze:

Html.EnumDropDownListFor(x=>x.EnumProperty) 

Während mit:

public MyEnum EnumProperty {get;set;} 

Im View-Modell funktioniert das Dropdown-Fenster wie erwartet (ich sehe FirstElement, und der angehängte Wert ist element1)

Das Problem ist, dass ich einen Strich im Wert haben wollen, wie folgt aus:

public enum MyEnum 
{ 
    [Display(Name="FirstElement")] 
    element1 = 1, 
    [Display(Name="SecondElement")] 
    element2 = 2, 
    [Display(Name="Third")] 
    element-dashed = 3 
} 

Es wird nicht funktionieren, als Element-Strich kein gültiger Eintrag ist. Das wird nicht funktionieren:

[Value("element-dashed")] 
[Display(Name="Third")] 
elementDashed = 3 
+0

Ich denke, Sie verwirren, was ist Code/Daten und was UI ist. Nur weil C# solche fantastischen Dinge in der Benutzeroberfläche zulässt, heißt das nicht, dass der Code dies unterstützt (z. B. Variablen oder Typen mit Bindestrichen in ihnen). Warum wollen Sie eine Variable mit einem Bindestrich drin (an dieser Stelle ist die Variable/Enum Daten, nicht etwas in der Benutzeroberfläche) – Neil

+0

Ich bin nicht verwirrend zwischen ihnen, ich weiß, der Code unterstützt Bindestriche in Variablen, die nicht ist, was das Problem verursacht. Aber es ist erforderlich/erforderlich, dass ich einen Strich in den Wert beim Speichern habe, und die Anforderungen von jemandem kommen, der nicht technisch ist. Ich dachte daran, einfach "elementDashed" durch "element-gestrichelt" in einem Mapper von irgendeiner Art zu ersetzen, beim Speichern, aber suchte nach einem besseren Weg, wenn möglich. –

+0

Ich nehme an, irgendwann wird dieser Wert in eine Datenbank geschrieben oder in ein anderes "externes" System exportiert? Machen Sie einfach die erforderliche Formatierung dort. – Neil

Antwort

0

Die Antwort auf Ihre Frage ist einfach. Aber es bedarf einer Erklärung, um zu erklären, warum dies die Antwort ist.

Es gibt keinen funktionalen Grund, einen Bindestrich in einem Enum zu wollen.

Lassen Sie uns sagen, dass ich eine funktionierende Anwendung haben, die Ihre Enum enthält:

public enum MyEnum 
{ 
    [Display(Name="FirstElement")] 
    element1 = 1, 
    [Display(Name="SecondElement")] 
    element2 = 2 
} 

nehme ich die enumerator Namen ändern:

public enum MyEnum 
{ 
    [Display(Name="FirstElement")] 
    BatmanIsBruceWayne = 1, 
    [Display(Name="SecondElement")] 
    SupermanIsClarkKent = 2 
} 

ich davon aus bin, dass jede Nutzung der Enumeration in Code wird auch entsprechend angepasst. Wenn Sie die Methode Rename in VS (F2) verwenden, ist dies automatisch der Fall.

An der Funktionsweise der Anwendung hat sich nichts geändert. Funktional gesehen spielt der Name eines Enums keine Rolle.

public enum CardSuit { Hearts, Spades, Diamonds, Clubs } 

public enum CardSuit { TheRedOne, TheBlackOne, TheOtherRedOne, TheOtherBlackOne } 

Natürlich ist die erste für Entwickler viel besser lesbar als die zweite. Ein Compiler kümmert sich jedoch nicht um die Bedeutung der Enum-Namen. Es interessiert nur , dass der entsprechende Wert konsequent verwendet wird.

Dies ist das gleiche Prinzip wie Variablennamen. Natürlich sollten wir darauf achten, Variablennamen von Entwicklern lesbar zu machen. Es gibt keinen technischen Grund (d. h. zur Funktionalität der Anwendung), warum wir int myDescriptiveInteger über int x verwenden sollten.
Wir wählen nur einen beschreibenden Namen aus Gründen der Lesbarkeit für Menschen, die den Code pflegen.


Es gibt eine einzige Ausnahme: Wenn Sie .ToString() auf Enum anrufen, um eine String-Darstellung des Feldes haben Sie verwenden.

Hinweis: Dies ist zwar technisch möglich und wurde zuvor von anderen durchgeführt; Ich frage mich, ob Sie das wirklich hier tun sollten. Sie weisen den enum-Werten bereits explizite int-Werte zu. Diese int-Werte sind viel einfacher zum Speichern/Laden einer Enumeration, anstatt zu versuchen, mit ihrer String-Entsprechung zu arbeiten. Obwohl beide technisch möglich sind, ist die Verwendung von int aufgrund des geringeren Platzbedarfs und des fehlenden Namensproblems, das Sie hier fälschlicherweise beheben möchten, viel besser.

Es ist nicht klar aus Ihrer Frage, ob dies für Sie der Fall ist. Vielleicht ist es irgendwo in Ihrer Anwendung, vielleicht nicht. Ich kann es nicht wissen, ohne dass du es mir erzählst.

Wenn es nicht getan ist, dann ist Ihr Problem funktional irrelevant. Der Name spielt keine Rolle, außer zu Lesbarkeitszwecken, und ich bin ziemlich überzeugt, dass Ihre Entwickler nicht plötzlich aufhören werden, die Absicht des Codes zu verstehen, weil ein Strich fehlt.

Wenn es fertig ist, dann haben Sie tatsächlich bereits die Antwort auf Ihr Problem zur Verfügung gestellt. Anstatt .ToString() auf dem Enum zu benennen; Stattdessen müssen Sie den Wert [Display(Name="FirstElement")] als den richtigen "String-Namen" für Ihr Enum verwenden.

myEnumValue.ToString(); 

dem folgenden Code, der richtig die anstelle des ENUM-Feldname Wert Attribut verwendet:

public static string GetName(this myEnum enumValue) 
{ 
    return enumValue.GetType() 
        .GetMember(enumValue.ToString()) 
        .GetCustomAttribute<DisplayAttribute>() 
        .GetName(); 
} 

Und dann können Sie den folgenden Code ändern

myEnumValue.GetName(); 

In beiden In den Fällen bleibt die Kernantwort gleich: Sie müssen sich keine Gedanken über den spezifischen Namen Ihrer Enum-Felder machen, da es funktional irrelevant ist.


bearbeiten Wenn Sie Ihren Enum-Wert anders in der Combobox angezeigt werden soll, als Sie es haben wollen, wenn Sie den Wert speichern, dann ein zweites Attribut zwischen den beiden zu unterscheiden verwenden. Aber das Prinzip steht immer noch: Beruhige dich nicht von den Feldnamen, als ein Enum verwendet.

Und ich möchte noch einmal betonen, dass Sie die ganzzahligen Werte Ihrer enum verwenden sollten. Ich sehe keinen Grund, warum Sie Ihrem Enum int-Werte explizit zuweisen und sie dann ablehnen würden.

+0

Ich brauchte nicht unbedingt die Feldnamen zu verwenden, weshalb ich versuchte, das Attribut Value zu verwenden, und warum der Titel benutzerdefinierten Wert sagt. Eine Erweiterungsmethode scheint in meinem Fall die beste zu sein, eine, die ein [Value] -Attribut verwendet, da die [Display] -Einheit getrennt bleiben soll, da sie eine andere Bedeutung hat. –

Verwandte Themen