2012-04-04 19 views
12

Me pregunto si existe una forma de utilizar el enlace de modelo incorporado similar al enlace de modelo interno que se produce antes de una acción de controlador.Enlace de modelo manual con .Net Mvc

Mi problema es que quiero poder controlar la vinculación, ya que no sabré el tipo de objeto para vincular hasta que realmente esté en el contexto de la acción del controlador.

entiendo que puedo heredar el DefaultModelBinder para llevar a cabo la costumbre de unión, pero estoy feliz con lo que ya está en oferta, y sólo quiere utilizarlo - tomar este ideales ejemplo para tener una idea de lo que busco :

public ActionResult DoCustomBinding(string modelType) 
{ 
    ... // logic to determine type to check and create strong 'actual' type 

    object model = BindModel(actualType); 

    ... // do something with bound model 

    return View(); 
} 

he mirado en el uso de la DefaultModelProvider pero no está seguro si esta es la forma correcta de ir sobre esto y yo no estaba segura de cómo obtener la ModelBindingContext.

+0

Tienes razón. Es un comportamiento deficiente en un sitio tan útil, me he dado un buen tic-tac. –

+0

Trataré de ser más específico, mi objetivo final es poder validar una sola propiedad de una clase decorada con atributos de validación. Por lo tanto, armado con solo un nombre de cadena del tipo que se va a verificar, nombre (s) de campo y valor (es) - Me gustaría poder vincular el modelo (que tendré que calcular a partir del tipo), luego realizar controles en él. –

+0

Voy a echar un vistazo al ControllerActionInvoker http://aspnet.codeplex.com/SourceControl/changeset/view/72551#266452, parece que podría darme una idea de cómo se hace internamente. –

Respuesta

0

¿Has consultado la interfaz de IModelBinder?

public class CustomModelsBinder : IModelBinder { 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { } 
} 

y luego añadir esto a su archivo global.asax:

protected override void OnApplicationStarted() { 
    ModelBinders.Binders.Add(typeof(CustomModels), new CustomModelsBinder()); 
} 
+0

No del todo, y ya uso algo similar para trabajar con enums. Quiero usar el motor interno y decir, aquí está el tipo al que quiero crear y enlazar, ir a crear y enlazar a él y traer de vuelta el resultado (fuera de la rutina normal de una acción del controlador). –

0

Si desea validar sólo partes específicas de un modelo, este podría ser duplicado de una pregunta previamente respondí MVC Partial Model Updates.

Lo bueno de usar System.ComponentModel.DataAnnotations.MetadataType es que el encuadernador de modelos seguirá vinculando a un objeto derivado del cual es básicamente el mismo que el objeto base, solo con diferentes metadatos de visualización/validación.

+0

Gracias - esto parece útil, solo he logrado que funcione el encuadernado, así que tengo un par de soluciones que puedo ver ahora ... –

Cuestiones relacionadas