2009-12-24 17 views
9

Próbuję uaktualnić mój projekt MVC 1 do MVC 2 RC. Obecnie mamy niestandardowy modelarinder, który dodaje elementy do ValueProvider (działało to, gdy był słownikiem). Następnie przekazaliśmy to domyślnemu modelowi. Jednak IValueProvider nie ma metody dodawania, więc ten algorytm nie działa. Czy ktoś wie o sposobie dodawania wartości do ValueProvider w MVC 2?ASP.NET MVC 2 - Ustawianie wartości na 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

Ten sam problem w tej chwili, nie mogę znaleźć żadnej przyzwoitej dokumentacji na temat implementacji niestandardowych segregatorów modeli dla MVC2 w dowolnym miejscu. –

Odpowiedz

2

Problem polega na tym, że do czasu można dostać się do ModelBinder Twój ValueProvider został już ustawiony. Poprzednio w tym momencie można było dodać wartości do ValueProvider.

Aby udostępnić usługę Custom ValueProvider, należy zastąpić właściwość ControllerActionInvoker, która jest najlepszym rozwiązaniem. Niestety ControllerActionInvoker jest tworzony przez obiekt kontrolera, zamiast być wstrzykiwany. W związku z tym należy również zastąpić kontroler, aby wywoływał własny program ControllerActionInvoker.

+2

Wygląda na to, że w rzeczywistości jest to łatwiejsze rozwiązanie. Możesz po prostu stworzyć własny ValueProvider i dodać go do statycznej kolekcji ValueProviderFactories.Factories w Application_Start. –

0

Nie możesz użyć jednego z pochodnych typów IValueProvider? (lub nawet tworzyć własne, ale wydaje się, że są w nim odpowiednie implementacje)

ValueProviderDictionary. ValueProviderCollection, FormCollection (i jeszcze kilka) wszystkie implementują IValueProvider.

Nie jestem pewien, czy to pomaga. Nie jestem całkowicie pewien tego, co próbujesz zrobić. Nie musiałem tak często mieszać się z post-paramami.

+0

Możesz użyć typu pochodnego IValueProvider, ale musisz to udoskonalić dalej w górę potoku. –

+0

Pierwsze dwa zostały przestarzałe. – Martin

+0

Strona MSDN mówi, że "ValueProviderDictionary" jest przestarzałe, ale nie widziałem, gdzie mówi "ValueProviderCollection" jest? – Funka

0

Prawdopodobnie wpadłem w błąd, ale jaki jest ten prefiks, którego używasz? Czy jest to związane z relacją potomną Twojego modelu?

Jeśli nie, dlaczego nie wywodzić się z DefaultModelBinder i zastąpić metodę BindModel()? W ten sposób możesz zadzwonić pod numer base.BindModel() i manipulować wartościami później, jednak nie możesz wtedy użyć sprawdzania poprawności modelu (upewnij się, że czytasz http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html, ponieważ nastąpi znacząca zmiana w stosunku do wersji RC).

Bardziej czystym podejściem, z tego co, jak sądzę, próbuję zrobić, jest użycie ViewModel w tym przypadku. Ponieważ manipulacja jest prawdopodobnie nietrywialna, możesz chcieć oddzielić sprawdzanie danych wejściowych i modeli od siebie nawzajem.

Nie wiem, czy to pomoże albo ...

+0

Zasadniczo próbuję odszyfrować wartości, które mają określony prefiks. Staramy się, aby nasze ViewModels nie wiedziały o odszyfrowaniu - mają po prostu int i do czasu, gdy do nich dotrą, zostały odszyfrowane. Tak więc to nie rozwiązuje problemu. –