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 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)