2009-12-24 8 views
9

Estoy intentando actualizar mi proyecto MVC 1 a MVC 2 RC. Actualmente tenemos un enlazador de modelos personalizado que agrega elementos al ValueProvider (esto funcionó cuando era un diccionario). Luego pasamos esto al modelbinder predeterminado. Sin embargo, IValueProvider no tiene un método de agregar, por lo que este algoritmo ya no funciona. ¿Alguien sabe de una forma de agregar valores al ValueProvider en MVC 2?ASP.NET MVC 2 - Configuración de valores en 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

Mismo problema por el momento, no encuentro ninguna documentación decente sobre cómo implementar carpetas de modelo personalizadas para MVC2 en cualquier parte –

Respuesta

2

El problema es que en el momento en que llegue a la ModelBinder, su ValueProvider ya ha sido establecido. Anteriormente, podía agregar valores a su ValueProvider en este punto.

Para proporcionar un ValueProvider personalizado, debe anular el ControllerActionInvoker, que es la solución definitiva. Desafortunadamente, ControllerActionInvoker es creado por el objeto Controller, en lugar de ser inyectado. Por lo tanto, también debe anular el Controlador para llamar a su propio ControllerActionInvoker.

+2

Parece que en realidad hay una solución más fácil. Simplemente puede crear su propio ValueProvider y agregarlo a la colección estática de ValueProviderFactories.Factories en Application_Start. –

0

¿No puedes utilizar uno de los tipos derivados de IValueProvider? (o incluso crear uno propio, pero parece que hay implementaciones decentes en el marco)

ValueProviderDictionary. ValueProviderCollection, FormCollection (y un par más) todos implementan IValueProvider.

No estoy seguro si esto ayuda. No estoy completamente seguro de lo que estás tratando de hacer. No tuve que lidiar con mezclar tanto con los paramisetos.

+0

Puede utilizar un tipo derivado de IValueProvider, pero debe conectarlo más arriba en la canalización. –

+0

Los dos primeros han quedado en desuso. – Martin

+0

La página MSDN dice que 'ValueProviderDictionary' está en desuso, pero no vi dónde dice' ValueProviderCollection'? – Funka

0

Probablemente te equivoque, pero ¿cuál es el prefijo que estás usando? ¿Eso está relacionado con una relación infantil de tu modelo?

Si no, ¿por qué no derivar del DefaultModelBinder y anular el método BindModel()? De esta forma, puede llamar al base.BindModel() y manipular los valores posteriormente, sin embargo, no puede usar la validación del modelo (asegúrese de leer http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html, ya que habrá un cambio significativo en el lanzamiento vs. el RC).

El enfoque más limpio, por lo que puedo adivinar que intenta hacer, es usar un ViewModel en este caso. Dado que la manipulación probablemente no es trivial, es posible que desee separar la validación de entrada y modelo entre sí.

No estoy seguro si esto ayuda o bien ...

+0

Básicamente, estoy tratando de descifrar los valores que tienen un cierto prefijo. Estamos tratando de hacerlo para que nuestros ViewModels no sepan sobre el descifrado, solo tienen un int y para cuando se haya descifrado. Entonces, no, esto no resuelve el problema. –