asp.net-mvc - net - web forms c# ejemplos
publicar y obtener con la misma firma de método (7)
En mi controlador tengo dos acciones llamadas "Amigos". El que se ejecuta depende de si es un "obtener" versus una "publicación".
Así que mis fragmentos de código se ven así:
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
Sin embargo, esto no se compila ya que tengo dos métodos con la misma firma (Amigos). ¿Cómo hago para crear esto? ¿Debo crear una sola acción pero distinguir entre "obtener" y "publicar" dentro de ella? Si es así, ¿cómo hago eso?
Cambie el nombre del segundo método a algo similar a "Friends_Post" y luego puede agregar el [ActionName("Friends")]
al segundo. Por lo tanto, las solicitudes a la acción Friend con POST como tipo de solicitud se manejarán con esa acción.
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[ActionName("Friends")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends_Post()
{
// do some stuff
return View();
}
Intenta usar:
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
Marcar la respuesta de Cagdas como la respuesta desde que contestó mi pregunta. Sin embargo, dado que no me gusta usar el atributo ActionName en mi proyecto, utilizo una solución diferente. Simplemente agregué FormCollection a la acción "publicar" (que termina cambiando la firma del método)
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(FormCollection form)
{
// do some stuff
return View();
}
Si realmente solo quieres una rutina para manejar ambos verbos, prueba esto:
[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}
Una posible advertencia: estoy utilizando MVC versión 2. No estoy seguro si esto fue compatible con MVC 1. La documentación de Intellisense para AcceptVerbs debería informarle.
Sus métodos de acción no pueden estar haciendo lo mismo, de lo contrario no habría necesidad de escribir dos métodos de acción. Entonces, si la semántica es diferente, ¿por qué no usar diferentes nombres para los métodos de acción también?
Por ejemplo, si tiene un método de acción "eliminar" y GET solo solicita confirmación, puede llamar al método GET "ConfirmDelete" y el método POST simplemente "Eliminar".
No estoy seguro si eso coincide con su escenario, pero siempre me fue útil cuando tuve el mismo problema.
agregue al método de publicación los parámetros que desea recibir en la publicación. tal como esto:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(string friendName, string otherField)
{
// do some stuff
return View();
}
..o si tienes un tipo complejo, como este:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(Friend friend)
{
// do some stuff
return View();
}
Editar: sería preferible utilizar un enfoque más tipeado para recibir los elementos publicados, como se indica más arriba.
no estoy del todo seguro de si es la forma correcta, pero usaría un parámetro sin sentido para diferenciar los sigs. me gusta:
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends(bool isGet)
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
Sé que es feo y hambriento, pero funciona.