2009-12-24 15 views
9

Ich versuche, mein MVC 1 Projekt auf MVC 2 RC zu aktualisieren. Wir haben derzeit einen benutzerdefinierten Modelbinder, der dem ValueProvider Objekte hinzufügt (dies funktionierte, als es ein Wörterbuch war). Diese haben wir dann an den Standard-Modelbinder weitergegeben. IValueProvider verfügt jedoch nicht über eine add-Methode, daher funktioniert dieser Algorithmus nicht mehr. Kennt jemand eine Möglichkeit zum Hinzufügen von Werten zum ValueProvider in MVC 2?ASP.NET MVC 2 - Setzen von Werten auf IValueProvider

foreach(string valKey in controllerContext.RequestContext.HttpContext.Request.Form.AllKeys.Where(x => x.StartsWith(valuesToChangePrefix))) 
{ 
    string valName = valKey.Substring(valuesToChangePrefix.Length); 

    string myVal = ManipulateValue(bindingContext.ValueProvider.GetValue(valKey).AttemptedValue); 

    // This is where I need to add to my value Provider (As you can see I used to just assign a ValueProviderResult 
    //bindingContext.ValueProvider = new ValueProviderResult(myVal.Split(','), myVal, bindingContext.ValueProvider.GetValue(valKey).Culture); 
} 
+2

Das gleiche Problem im Moment, kann ich keine anständige Dokumentation finden, wie benutzerdefinierte Modell Bindemittel für MVC2 überall –

Antwort

2

Das Problem ist, dass Sie mit dem Modelbinder erhalten durch die Zeit, Ihre Valueprovider bereits eingestellt wurde. Zuvor konnten Sie zu diesem Zeitpunkt Werte zu Ihrem ValueProvider hinzufügen.

Um einen benutzerdefinierten ValueProvider bereitzustellen, müssen Sie den ControllerActionInvoker überschreiben, der die ultimative Lösung darstellt. Leider wird der ControllerActionInvoker vom Controller-Objekt erstellt und nicht injiziert. Daher müssen Sie auch Controller außer Kraft setzen, um Ihren eigenen ControllerActionInvoker aufzurufen.

+2

Es sieht so aus als gäbe es tatsächlich eine einfachere Lösung. Sie können einfach Ihren eigenen ValueProvider erstellen und ihn der statischen ValueProviderFactories.Factories-Auflistung in Application_Start hinzufügen. –

0

Können Sie nicht einen der abgeleiteten Typen von IValueProvider verwenden? (oder erstellen Sie sogar Ihre eigenen, aber es scheint anständige Implementierungen im Rahmen zu sein)

ValueProviderDictionary. ValueProviderCollection, FormCollection (und ein paar mehr) sie alle implementieren IValueProvider.

Ich bin mir nicht sicher, ob es hilft. Ich bin mir nicht ganz sicher, was Sie zu tun versuchen. Ich musste mich nicht so sehr mit den Postparams herumschlagen.

+0

implementieren Sie können eine abgeleitete Art von IValueProvider verwenden, aber Sie müssen das weiter oben in der Pipeline. –

+0

Die ersten beiden sind veraltet. – Martin

+0

Die MSDN-Seite sagt, dass "ValueProviderDictionary" veraltet ist, aber ich sah nicht, wo es heißt, die "ValueProviderCollection" ist? – Funka

0

Ich versteh dich wahrscheinlich falsch, aber was ist das Präfix Sie verwenden? Handelt es sich um eine Kinderbeziehung Ihres Modells?

Wenn nicht, warum nicht von der DefaultModelBinder ableiten und überschreiben die BindModel() Methode? Auf diese Weise können Sie base.BindModel() aufrufen und die Werte anschließend manipulieren, jedoch können Sie die Modellvalidierung dann nicht verwenden (stellen Sie sicher, dass Sie http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html lesen, da es eine signifikante Änderung in der Version gegenüber der RC geben wird).

Der sauberere Ansatz, von dem ich rate, dass Sie versuchen, ist, ein ViewModel in diesem Fall zu verwenden. Da die Manipulation wahrscheinlich nicht trivial ist, möchten Sie möglicherweise die Eingabe- und Modellvalidierung voneinander trennen.

nicht sicher, ob dies entweder hilft ...

+0

Grundsätzlich versuche ich Werte zu entschlüsseln, die ein bestimmtes Präfix haben. Wir versuchen, es so zu machen, dass unsere ViewModels nicht über die Entschlüsselung Bescheid wissen - sie haben nur ein int und mit der Zeit wird es entschlüsselt. Also, nein, das löst das Problem nicht. –