2009-08-11 6 views
16

Das Verhalten described here scheint jetzt der Standardwert für ASP.NET MVC 2 (mindestens für Vorschau 1).Modelbinding für leere Abfragezeichenfolgenparameter in ASP.NET MVC 2

Wenn ein Abfragezeichenfolgeflag wie diese modelbinding:

?Foo=&Bar=cat 

Die folgende Bindung erfolgt (vorausgesetzt, Sie zu einem Modell mit 'Foo' sind verbindlich und 'Bar' string Eigenschaften)

ASP.NET MVC 1

model.Foo = ""; 
model.Bar = "cat": 

ASP.NET MVC 2 (Vorschau 1 bis RC)

model.Foo = null; 
model.Bar = "cat": 

Wollte jemand geben, die mit V2, da dies in der ‚gu-notes‘ nicht erwähnt wurde ein Heads-up gespielt wird. Auch neugierig, ob jemand, der Bescheid weiß, kommentieren kann, ob dies die endgültige Implementierung oder ein konfigurierbares Feature sein wird? Mir geht es in jeder Hinsicht gut, aber ich hoffe nur, dass sie nicht auf den alten Weg zurückgehen! Konfigurierbar wäre noch besser.

Edit: Die Lehre aus diesem Punkt zu lernen, ist, was Version Sie entwickeln gegen nicht Code zu schreiben, sagt Foo.Length == 0 für eine leere Zeichenfolge zu testen oder Foo.Length> 3 zu prüfen eine minimale Länge. Verwenden Sie string.IsNullOrEmpty (Foo) und/oder prüfen Sie zuerst auf Null.


Update: Diese Frage löste meine Neugier, warum würden sie tatsächlich diese Änderung vornehmen. Ich denke, dass ich bei der Untersuchung von Behinderungskontrollen auf die Antwort gestoßen bin. Die W3 HTML-Spezifikation definiert eine ‚successful control‘ wie folgt:

Eine erfolgreiche Steuerung „gültig“ für Vorlage ist. Bei jedem erfolgreichen Steuerelement ist der Steuerelementname mit dem aktuellen Wert als Teil des übermittelten Formulardatensatzes gepaart. Ein erfolgreiches Steuerelement muss in einem FORM-Element definiert werden und muss einen Steuerelementnamen haben.

Mit anderen Worten - ein erfolgreiches Steuerelement ist eines, das es als Abfragezeichenfolgenparameter zurück zum Server macht. Nun, wenn eine Kontrolle keinen gültigen Wert dann entsprechend der Spezifikation:

Wenn ein Steuerelement nicht über ein current value wenn das Formular abgeschickt wird, Benutzer Mittel sind nicht zu behandeln es erforderlich, als eine erfolgreiche Kontrolle.

(vor Ort die ‚offen für Interpretation‘ Sprache hier mit ‚nicht erforderlich ...‘)

Ich denke also, durch eine Null statt einer leeren Zeichenfolge sendet es Browser Inkompatibilitäten reduziert, wo bestimmte Browser kann senden Sie Foo=&Bar= und andere möglicherweise nicht einmal diesen Abfragezeichenfolgenparameter senden. Indem du immer Foo= interpretierst, als ob Foo überhaupt nicht da wäre, zwingst du dazu, defensiver zu sein.

Ich denke, ich bin zumindest auf dem richtigen Weg, was den Grund hier angeht - und hat zumindest teilweise etwas mit der Idee einer "erfolgreichen Kontrolle" zu tun.

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

+0

Danke für die Info, Simon! –

+0

Danke ... dieser eine gibt mir kleine Kopfschmerzen zu finden ... Ich frage mich, warum diese Änderung gemacht wurde, obwohl ... Es fügt wirklich keinen Wert außer mehr Arbeit für uns! Geht es um Speicheroptimierung? Nimmt eine leere Zeichenkette etwas Speicherplatz angesichts einer Null ein ??? –

+0

@jalchr - Ich habe meine Frage mit dem, was ich denke, ist der Grund, warum sie das getan –

Antwort

4

Null ist mehr Vertreter dessen, was es eigentlich ist, und es ist kompatibel mit anderen Nullable Types neben string, so stelle ich mir es durch Design ist.

+0

Ich konnte sehen, dass dies ein Problem für Leute, die bereits große Anwendungen gebaut haben angenommen "" und prüfen Foo.Length == 0. vielleicht Sie mussten dies wegen der neuen Bindungsfunktionalität tun. Ich mag irgendwie "" manchmal, weil es mir zeigt, dass etwas tatsächlich gesetzt wurde, aber das ist ein kleiner Punkt –

+0

Wer viel in ASP.Net MVC investiert, sollte bereits einen Upgrade-Pfad in Betracht ziehen, wie jung das MVC-Framework ist. – womp

+0

string.IsNullOrEmpty (..) sollte sowieso Ihre Basen abdecken. – Runeborg

0

Eine Möglichkeit zum Konfigurieren wäre das Ersetzen des Standardmodellbinders in V2 (oder V1), um konsistentes Verhalten zu erhalten. Ich bevorzuge die Null, ich selbst.

3

Ich bevorzuge das Verhalten von v1. Wie können Sie in v2 eine leere Zeichenfolge übergeben? Darüber hinaus können Sie mit letzterem nicht sagen, ob foo in den Abfrageparametern ist oder nicht.

+0

nichts wie eine nullreferenceexception, um Ihnen zu sagen, dass Sie vergessen, etwas richtig zu senden! Zuerst dachte ich, dass es mich wirklich nervte, aber ich bin damit einverstanden, weiter zu denken. In seltenen Fällen müssen Sie in einem Webkontext eine leere Zeichenfolge übergeben (oder vielmehr von einer Null unterscheiden). Wenn du das wirklich willst, dann haben sie vielleicht Attribute, mit denen du Eigenschaften dekorieren kannst. Ich denke, wir werden einige coole modellbindende Funktionen in V2 sehen und ich würde erwarten, dass dies in die –

+0

@thomas nur aktualisiert meine Antwort mit Bezug auf diese, die ich denke, erklärt, warum http://www.w3.org/TR/html401 /interact/forms.html#h-17.13.2 –