ASP MVC.NET - wie binden KeyValuePair?
Ist es möglich, zu binden, eine solche Art von Eigentum?
public KeyValuePair<string, string> Stuff { get; set; }
Ich habe versucht, verwenden Sie folgenden code in die anzeigen, aber es funktioniert nicht:
<%=Html.Text("Stuff", Model.Stuff.Value)%>
<%=Html.Hidden("Model.Stuff.Key", Model.Stuff.Key)%>
Bitte beschreiben Sie, was "es funktioniert nicht" bedeutet.
Was genau funktioniert nicht? Könnten Sie das ein wenig erläutern?
Ich versuche, die Daten zu verarbeiten, die aktualisiert wurde, also im controller bin ich richtiger aktualisierte Modell, aber diese Besondere Eigenschaft keinen Wert hat. In meinem Fall ist es [null, null].
Was genau funktioniert nicht? Könnten Sie das ein wenig erläutern?
Ich versuche, die Daten zu verarbeiten, die aktualisiert wurde, also im controller bin ich richtiger aktualisierte Modell, aber diese Besondere Eigenschaft keinen Wert hat. In meinem Fall ist es [null, null].
InformationsquelleAutor Andrey Sidorenko | 2009-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
KeyValuePair<K,V>
ist eine Struktur, nicht eine Klasse, so dass jeder Anruf auf IhrStuff
- Eigenschaft wird eine Kopie der original -KeyValuePair
. Also, wenn Sie binden anModel.Stuff.Value
und zuModel.Stuff.Key
Sie tatsächlich arbeiten auf zwei verschiedene Instanzen vonKeyValuePair<K,V>
, keiner von denen ist die eine von Ihrem Modell. Also, wenn Sie aktualisiert werden, es aktualisiert nicht die Sachen, die Eigenschaft in Ihrem Modell... QEDDurch die Art und Weise, die Schlüssel und Wert-Eigenschaften sind schreibgeschützt, so dass Sie nicht ändern können Sie : haben Sie zu ersetzen, die
KeyValuePair
InstanzFolgenden workaround sollte funktionieren :
Modell :
Anzeigen :
Wie es scheint, sauberer ist Sie zu einer Klasse. Es ist frustrierend, -- mehr code (wie oben) oder einer anderen Klasse. Hrm... Danke für diese Frage.
Auch dieser , post mit
Dictionary
kann jemand helfen.InformationsquelleAutor Thomas Levesque
Funktionieren könnte?
InformationsquelleAutor Daniel Elliott
Wenn Sie zu binden, müssen Sie ein Wörterbuch, so dass jeder Wert hat eine texbox zu Bearbeiten, unten ist ein Weg, um es Arbeit. Die wirklich wichtigen Teile, die beeinflussen, wie das name-Attribut in das HTML generiert wird, ist das Modell expression, was dafür sorgt das Modell Bindung tritt auf postback. Dieses Beispiel funktioniert nur für das Wörterbuch.
Dem verlinkten Artikel erklärt die HTML-syntax, die macht der Bindung arbeiten, aber es lässt die Razor-syntax, dies zu erreichen ganz ein Rätsel. Auch der Artikel ist ganz anders, als Sie sind, indem Sie beide Tasten und Werte bearbeitet werden, und sind mit einem integer-index, obwohl das dictionary-key ist ein string, kein integer. Also, wenn Sie versuchen zu binden, ein Wörterbuch, die Sie wirklich brauchen, um zuerst zu evaluieren, ob Sie wollen einfach nur Werte bearbeitet werden, oder beide Schlüssel und Werte, bevor Sie sich entscheiden, auf welcher Ansatz zu nehmen, da die Szenarien Recht unterschiedlich sind.
Wenn Sie jemals brauchen zu binden, um ein Komplexes Objekt, also Wörterbuch, dann sollten Sie nur in der Lage sein, um eine textbox für jede Eigenschaft mit dem Ausdruck Bohrungen in der Eigenschaft, ähnlich wie die Artikel.
http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx
CSHTML:
Editoren für die Werte nur(natürlich könnte man hinzufügen LabelFor zum erstellen von Etiketten basierend auf dem Schlüssel):
Bearbeiten der beiden Schlüssel/Werte:
@{ var Felder = Modell.Felder.ToList(); }
InformationsquelleAutor AaronLS
Weiß ich, dass dies eine etwas ältere Frage, aber ich wusste nicht wie jede der vorgeschlagenen Lösung, so gebe ich mir.
Ich habe umgeschrieben default modelbinder zu handhaben KeyValuePairs, damit ich Sie verwenden kann wie vorher.
InformationsquelleAutor Petr J