2009-06-09 14 views
36

que tiene un tipo:ASP.NET MVC - Mezcla de encargo y modelo predeterminado Encuadernación

public class IssueForm 
{ 
    Order Order {get; set;} 
    Item Item {get; set;} 
    Range Range {get; set;} 
} 

he creado una carpeta de modelo personalizado debido a los requisitos de orden y de artículos, pero todavía Rango podrían utilizar el modelo predeterminado Binder.

¿Hay alguna manera desde dentro de mi carpeta de modelo personalizado para llamar al encuadernador de modelo predeterminado para devolver un objeto de rango? Creo que solo tengo que configurar ModelBindingContext correctamente, pero no sé cómo.


EDITAR

Mirando el primer comentario y respuesta - Parece que hereda de la carpeta por defecto del modelo podría ser útil.

Para añadir más detalles de mi configuración hasta ahora tengo:

public IssueFormModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     Order = //code to pull the OrderNumber from the context and create an Order 
     Item = //code to pull the ItemNumber from the context and create an Item 

     IssueForm form = IssueFormFactory.Create(Order, Item); 

     form.Range = // ** I'd like to replace my code with a call to the default binder ** 

     return form 
    } 
} 

Esto podría ser una manera estúpida de hacerlo ... este es mi primer aglutinante modelo. Solo señalando mi implementación actual.


editar # 2

para que las respuestas para anular BindProperty funcionará si puedo enganchar en un método como "estoy todo hecho vinculante" y llame al método de fábrica con las propiedades.

Creo que realmente debería mirar la implementación DefaultModelBinder y dejar de ser estúpido.

+1

No estoy seguro de si es la solución más elegante, pero ¿podría derivar su carpeta de modelo personalizado de DefaultModelBinder en lugar de implementar IModelBinder? Luego, cuando anule BindModel, pase la responsabilidad a DefaultModelBinder donde corresponda. De lo contrario, use un enlace personalizado. –

+0

Yah, veo que algunos archivos de carpetas modelo se salgan de IModelBinder y DefaultModelBinder. Supongo que DefaultModelBinder tiene algunos métodos adicionales que supongo que llama desde el método BindModel, para que pueda enfocar más sus necesidades. – anonymous

+0

Solo confirma mi decisión de ignorar manualmente el procesamiento y la validación de entrada y código de ModelBinder. Ahora lo tengo consistente, transparente y ajustable a las necesidades futuras presentes e imaginables. – User

Respuesta

24

intentar algo como esto:

public class CustomModelBinder : DefaultModelBinder { 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) { 
     if(propertyDescriptor.Name == "Order") { 
      ... 
      return; 
     } 

     if(propertyDescriptor.Name == "Item") { 
      ... 
      return; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

} 
+0

Probablemente estoy siendo estúpido aquí, pero ¿cómo se implementa la clase CustomModelBinder, seguramente eso tiene que ser instanciado en alguna parte para que esto funcione? ¿Tal vez como un atributo en los params ActionResult? –

49

anulación del BindProperty del DefaultModelBinder:

public class CustomModelBinder:DefaultModelBinder 
     { 
      protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
      { 
       if (propertyDescriptor.PropertyType == typeof(Range)) 
       { 
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
       } 
       // bind the other properties here 
      } 
     } 
+20

+1 para ingresar el tipo de propiedad en lugar del nombre. ¡Culpe a las cuerdas mágicas! –

6

creo que me he registrado dos enlazadores de modelos personalizados diferentes, uno para la orden y uno para el artículo, y deje que el encuadernador de modelos predeterminado maneje el Rango y el IssueForm.

+4

Sí, obviamente ha pasado un tiempo desde que hice esta pregunta. Terminé mirando el código DefaultModelBinder y dándome cuenta de la naturaleza recursiva del enlace del modelo. No me di cuenta que con un tipo complejo que contiene otros tipos complejos podría simplemente definir un modelo de carpeta para cada uno individualmente. En cambio, pensé que el padre complejo tendría que conocer los detalles de cada niño complejo. – anonymous

Cuestiones relacionadas