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
QueryStringdesde una solicitudGET?
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)