2010-02-11 8 views
9

Estoy creando un cuaderno de modelo personalizado en una aplicación de Mvc y quiero analizar una cadena a un valor de enumeración y asignarla a la propiedad del modelo. Lo tengo trabajando sobreescribiendo el método BindProperty, pero también noté que hay un método SetProperty.Cuál es la diferencia entre BindProperty y SetProperty en IModelBinder

protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
    { 
     switch (propertyDescriptor.Name) 
     { 
      case "EnumProperty": 
       BindEnumProperty(controllerContext, bindingContext); 
       break; 
     } 

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

    private static void BindEnumProperty(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var formValue = controllerContext.HttpContext.Request.Form["formValue"]; 

     if (String.IsNullOrEmpty(formValue)) 
     { 
      throw new ArgumentException(); 
     } 

     var model = (MyModel)bindingContext.Model; 
     model.EnumProperty = (EnumType)Enum.Parse(typeof(EnumType), formValue); 
    } 

no estoy seguro de cuál es la diferencia entre los dos y si estoy haciendo esto en la forma recomendada.

Respuesta

6

En primer lugar, BindProperty no es parte de IModelBinder pero es un método protegido en DefaultModelBinder. Puede acceder a él solo si está subclasificando DefaultModelBinder.

Los siguientes puntos deben responder a su pregunta:

  • BindProperty utiliza la interfaz IModelBinder que obtiene del PropertyType del argumento PropertyDescriptor. Este le permite inyectar propiedades personalizadas de en los metadatos de la propiedad .
  • BindProperty correctamente maneja la validación. También llama al método SetProperty solo si el nuevo valor es válido.

Así que si quieres una validación adecuada (usando los atributos de la anotación) definitivamente debes llamar a BindProperty. Al llamar a SetProperty omite todos los mecanismos de validación incorporados.

Debe verificar el código fuente de DefaultModelBinder ver lo que hace cada método, ya que el intellisense proporciona solo información limitada.

+0

La fuente está ahora en http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/DefaultModelBinder.cs – Rob

+0

@Rob Su URL no es válida también –

+0

@Kilanny, ¿cómo es? Todavía parece funcionar para mí. – Rob

0

Creo que SetProperty toma el valor real para establecer como el último parámetro.

Cuestiones relacionadas