tutorial net mvc español asp c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

español - mvc asp.net c#



Usando el atributo de ModelBinder contra ModelBinders.Add() (2)

El resultado de esas técnicas será el mismo, por lo que es principalmente una cuestión de con lo que el equipo se sienta más cómodo. Entonces podrías inventar una convención como la que dijiste.

Personalmente, prefiero no tener que establecer el atributo en cada método de acción que usa ese modelo. Entonces elegiría una de las siguientes opciones:

  • Establezca el atributo en la clase de modelo como:

    [ModelBinder(typeof(MyModelBinder))] public class MyModel { ... }

  • Registro global de la carpeta

    ModelBinders.Binders.Add(typeof(MyModel), new MyModelBinder())

Otra razón por la que prefiero uno de estos es porque si alguna vez tiene que desencadenar manualmente el proceso de vinculación del modelo, también puede desear que se use su carpeta de modelo personalizada:

public ActionResult SomeActionMethod() { MyModel model = ... //manually invoke the model binding process considering only query string data //The custom model binder will be used only if it was globally registered //in the binders dictionary or set in an attribute of the model class TryUpdateModel(model, new QueryStringValueProvider()) ... }

También tiene la opción de implementar su propia lógica para seleccionar carpetas de modelo implementando la interfaz IModelBinderProvider y registrándose en el archivo.asax global como en

ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider())

Una forma de utilizar el atributo en los parámetros del método podría ser anular para ese método en particular el enlazador modelo que de otro modo se usaría. De modo que podría registrar globalmente un archivador modelo para su clase y anularlo en un método de acción particular utilizando el atributo.

Al final, hay bastantes opciones para seleccionar el archivador modelo. En asp MVC 3 esto se resolverá de la siguiente manera (suponiendo que está utilizando el ControllerActionInvoker predeterminado)

  1. El atributo en el parámetro de la acción. Vea el método GetParameterValue de la clase ControllerActionInvoker

  2. La Carpeta regresó del IModelBinderProvider. Ver el método GetBinder en la clase ModelBinderDictionary

  3. The Binder registrado globalmente en el diccionario ModelBinders.Binders.

  4. El Binder definido en el [ModelBinder()] para el tipo de modelo.

  5. The DefaultModelBinder.

¿Puede alguien decirme las ventajas y desventajas de usar el [ModelBinder()] frente al registro de carpetas de modelo a través de ModelBinders.Add() en global.asax?

Una ventaja que se me ocurre es que es más explícita, mientras que el registro en los ModelBinders globales no es tan simple para alguien que inspecciona el método de acción.

Una compensación que se me ocurre es que no es reutilizable, ya que tendrías que agregar este atributo a todos los métodos de acción que necesiten usar este modelo, mientras que el registro en ModelBinders global lo hará disponible para todos los métodos de acción que reciban ese modelo.

¿Es esta la única diferencia?

En otras palabras, afirmaría que esto es correcto:

  • Si solo usa el modelo en un método de acción (tal vez dos, obtenga + publicación), entonces use [ModelBinder()] .
  • Si usa el modelo en más de un método de acción, regístrelo en el ModelBinders global.

Me parece que la ventaja de utilizar un atributo en lugar de agregarlo a la colección de carpetas modelo en Global.asax es que puedes indicarle al método (o clase) qué carpeta específica usar en lugar de asociarla con un tipo específico. Luego puede crear el modelo basado en un contexto en lugar de un tipo.