tutorial net mvc entre ejemplos diferencias asp c# asp.net-mvc http-get custom-model-binder

net - web forms c# ejemplos



Carpeta de modelos personalizada para ASP.NET MVC en solicitud GET (1)

Supongamos que tiene su propio tipo que desea enlazar.

public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } // other properties you need }

Puede crear un enlace de modelo personalizado para este tipo específico, heredado de DefaultModelBinder , para muestra:

public class PersonModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var request = controllerContext.HttpContext.Request; int id = Convert.ToInt32(request.QueryString["id"]); string name = request.QueryString["name"]; int age = Convert.ToInt32(request.QueryString["age"]); // other properties return new Person { Id = id, Name = name, Age = age }; } }

En Global.asax en el evento Application_Start , puede registrar este enlace de modelo, para muestra:

// for Person type, bind with the PersonModelBinder ModelBinders.Binders.Add(typeof(Person), new PersonModelBinder());

En el método BindModel de PersonModelBinder , asegúrese de tener todos los parámetros en la cadena de consulta y deles el tratamiento ideal.

Ya que tienes este método de acción:

public ActionResult Test(Person person) { // process... }

Puedes acceder a esta acción con un url similar a este:

Test?id=7&name=Niels&age=25

He creado un modelo de carpeta de MVC personalizado que se llama para cada HttpPost que entra en el servidor. Pero no se llama para HttpGet solicitudes HttpGet .

  • ¿Debería llamarse a mi carpeta de modelos personalizada durante un GET ? Si es así, ¿qué me perdí?
  • Si no es así, ¿cómo puedo escribir código personalizado que maneje QueryString desde una solicitud GET ?

Aquí está mi implementación ...

public class CustomModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { // This only gets called for POST requests. But I need this code for GET requests. } }

Global.asax

protected void Application_Start() { ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); //... }

He investigado estas soluciones, pero no funcionan bien para lo que estoy buscando:

  • Persistiendo tipos complejos a través de TempData
  • Usar el cuaderno predeterminado para construir tipos complejos ( ?Name=John&Surname=Doe )

Comentario sobre la respuesta

Gracias a @Felipe por la ayuda. Por si alguien lucha con el mismo, aprendí:

  • El enlazador de modelo personalizado se puede usar para solicitudes GET
  • Puedes usar la clase DefaultModelBinder
  • Mi problema fue que el método de acción DEBE tener un parámetro (de lo contrario, la carpeta del modelo se omite para las Solicitudes GET , lo que tiene sentido cuando lo piensas)