2008-11-27 3 views

Antwort

12

Dies ist genau die gleiche wie Request.Querystring modifizieren. Beide sind intern durch private Eigenschaften kompliziert und was könnte ein Fehler sein, aber es gibt zwei mögliche Lösungen, die mir bekannt sind (Ich werde den response.redirect Plan aus der Hand entlassen - das ist schrecklich).

Methode ist Reflektion zu verwenden, um die Sammlung direkt zu ändern:

NameValueCollection oQuery = Request.QueryString; 
oQuery = (NameValueCollection)Request.GetType().GetField("_queryString",BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Request); 
PropertyInfo oReadable = oQuery .GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
oReadable.SetValue(oQuery, false, null); 
oQuery["foo"] = "bar"; 
oReadable.SetValue(oQuery, true, null); 

Plan B, die ich denke, eignet sich besser, um Unit-Test ist mit der Sammlung zu vermeiden, direkt zu tun und stattdessen es als Namevaluecollection passieren zu jeder Methode, die Sie damit umgehen wollen, oberflächliches Kopieren, was auch immer Sie brauchen. Ich habe das selbst benutzt, um Web-Anfragen zu verspotten.

Edit: Marc GRA gab beredte Gründe für Plan B

+1

private Sachen auf diese Weise Manipulieren ist keineswegs eine vorgeschlagene Sache und soll so viel wie möglich (~ = unter allen Umständen) vermieden werden. Schließlich werden sie aus einem bestimmten Grund privat gemacht. Sie werden sich auf eine bestimmte Version einer Bibliothek verlassen. Jede Änderung in der zugrunde liegenden Implementierung kann Ihre App beschädigen. –

+0

Und Sie werden sehen, ich befürworte Plan B – annakata

+0

Plan A verpasste etwas Detail. Ich denke es ist nicht richtig. Sie können selbst testen. –

2

Das Formular ist eine Darstellung von dem, was der Client in der Anfrage gesendet. Was willst du machen? Persönlich würde ich versuchen, den Code "read the form" von dem Code "tue etwas mit den Werten" zu trennen - auf diese Weise können Sie jede Vorverarbeitung (beim Lesen aus dem Formular) und keine der späteren durchführen Code muss wissen, was tatsächlich gesendet wurde - es nimmt nur die Werte, die ihm gegeben werden (dh es spricht nie direkt mit der Anfrage).

Wenn dies auch bedeutet, dass Sie Ihre Logik testen können, ohne ein Formular oder gar eine http-Anfrage zu benötigen.

Eigentlich ASP.NET MVC für Sie tun ... eine Menge von dieser (der obigen Absatz)

Beachten Sie, dass die .Items Sammlung aktualisieren können - aber das ist ein bisschen mehr vage (dh es bezieht sich nicht speziell auf die Form).

(prost zur Fixierung des Tippfehler BTW)

Verwandte Themen