Modellbindung an Enums in ASP.NET MVC 3
Ich habe eine Methode in meinem controller, akzeptiert ein Objekt als argument und gibt eine JsonResult. Eine der Eigenschaften, die auf dieses Objekt ist ein enum mit drei möglichen Werten. Ich nahm an, dass der client beim übergeben in eine int für die Eigenschaft, die es bevölkern die enum, aber es funktioniert nicht, es wird standardmäßig auf 0 und das enum gesetzt ist, um die erste der beiden Auswahlmöglichkeiten.
Irgendwelche Vorschläge?
Kommentar zu dem Problem
Versuchen Sie, beim binden einer dropdown-Auswahl?
Nein. Es ist ein Objekt übergeben bekommt als JSON zurück, dann auf den nächsten AJAX-request übergibt er das JSON-Objekt an den server zurück. Ich bin Modell-Bindung an dieses JSON-Objekt ist. Eine der Eigenschaften, die auf dieses Objekt ist ein enum in C# - code. Auf der client-Seite kann ich sehen, wenn ich serialisieren der C# - Objekt in json, richtig füllt das JSON-Objekt mit einem integer-Wert des enum, aber wenn ich den pass zurück und binden es, den enum standardmäßig auf null gesetzt.
Ist dein enum basiert auf int? enum MyEnum : int {MyEnumValue = 3} Auch, wenn Sie den string-Wert (anstelle des int), es wird auch zu binden. Sie können auch eine benutzerdefinierte Modell-binder für Ihre enum.
Das klingt wie eine Verhalten, wenn die enum-Eigenschaft ist nicht festgelegt.. das ist nicht Ihr Fall, wie ich vermute
Im firebug kann ich sehen das json-Objekt hat den richtigen int und macht den ajax-request mit den richtigen int. Wenn ich den debug auf dem server die enum ist standardmäßig auf null (als wenn es nicht gesetzt).
InformationsquelleAutor der Frage Chev | 2011-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
HINWEIS: Dieses Problem wurde behoben in MVC 4. Wenn Sie ein Upgrade auf MVC 4 ist eine praktikable option für Ihr Projekt, dann ist alles, was Sie tun müssen, um zu beginnen Modell-Bindung an enums.
Gesagt, hier ist der workaround für MVC 3, wenn Sie es noch brauchen.
Das Problem mit dem Standard-Modell von binder in MVC. Die korrekte integer-Wert macht es zu dem Modell, Bindemittel, sondern das Bindemittel ist nicht codiert, um anzeigen auf den integer-Wert des enum. Es richtig bindet, wenn der Wert der übergeben wird ein string, der den Namen Wert der enum. Das problem mit diesem ist, dass, wenn Sie analysieren ein C# - Objekt in JSON mit der
Json()
Methode sendet den angegebenen integer-Wert, wie die enum-Wert, nicht den Namen Wert.Die einfachste und transparenteste Lösung für dieses Problem ist das überschreiben der default modelbinder und schreiben eigene Logik zu fixieren, wie es bindet enums.
Erstellen Sie eine neue Klasse, wie so.
Dann registrieren Sie sich einfach in Ihr Global.asax-Datei.
Das ist es. Enumerationen, werden nun korrekt gebunden auf JSON-Objekten.
http://www.codetunnel.com/how-to-bind-to-enums-on-json-objects-in-aspnet-mvc-3
InformationsquelleAutor der Antwort Chev
Welche über die Bindung an einen Haken Eigenschaft auf Ihr Modell?
InformationsquelleAutor der Antwort RPM1984
Ok, Jungs. Ich habe mir ein paar Möglichkeiten, dies zu tun, weil ich müde war, zu schreiben, blöde Arbeit, um in der Vergangenheit diesen Mangel in der .Net-framework. Basierend auf ein paar threads, die ich zusammengestellt haben, die folgende Lösung.
Haftungsausschluss ist dies nicht eine völlig automatisierte Lösung, so dass es nicht Arbeit für alle. Angesichts meiner Implementierung funktioniert es. Vielleicht ist mein Weg wird helfen, jemand anderes design, etwas, das funktioniert für Sie.
Ersten, erstellte ich eine enum-Respository heruntergeladen werden. Enumerationen, die nicht hier wohnen, aber würden Sie brauchen, um sichtbar zu werden aus dem repository.
Im repository, ich habe eine Klasse und eine öffentliche statische Eigenschaft stellen Sie eine Liste von enum-Typen.
Als Nächstes habe ich ein Modell entwickelt, binder und implementiert das interface IModelBinder (ref. kdawg Kommentar und link).
Könnte es helfen, fügen Sie einige code, um sicherzustellen, dass die Konvertierung von valueResult.AttemptedValue nicht scheitern.
Weiter, ich schlang Sie durch die Liste der enum-Typen, die ich oben erstellt und Hinzugefügt, model-Mappen, die für Sie (...im Allgemeinen.asax.cs).
Ich zugeben, das es nicht der intuitivste Weg, aber es funktioniert Super für mich. Fühlen Sie sich frei, zu lassen mich wissen, wenn ich kann diese optimieren.
InformationsquelleAutor der Antwort Difinity