2009-04-07 14 views
47

En mi controlador tengo dos acciones llamadas "Amigos". El que se ejecuta depende de si es un "obtener" versus una "publicación".publicar y obtener con el mismo método firma

Así que mis fragmentos de código ser algo como esto:

// 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 quiere compilar 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?

Respuesta

106

Cambie el nombre del segundo método a algo similar a "Friends_Post" y luego puede agregar el atributo [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(); 
} 
+7

desde MVC 2.0 '[AcceptVerbs (HttpVerbs.Get)] 'se puede acortar a' [HttpGet] ', lo mismo vale para otros métodos REST – nimrod

2

no estoy del todo seguro si es la forma correcta, pero usaría un parámetro sin sentido para diferenciar los sigs. como:

// 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 hackish, pero funciona.

2

Marcando la respuesta de cagdas como respuesta, ya que respondió mi pregunta. Sin embargo, dado que no me gusta usar el atributo ActionName en mi proyecto, utilizo una solución diferente. Simplemente añade el FormCollection a la acción "post" (que termina el cambio de 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(); 
} 
+0

Sería preferible usar un enfoque más tipeado para recibir los elementos publicados - ver respuesta –

1

se suman al método Post los parametros que desean recibir en el correo. tal como esto:

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(string friendName, string otherField) 
{ 
    // do some stuff 
    return View(); 
} 

..o si usted tiene un tipo complejo, así:

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(Friend friend) 
{ 
    // do some stuff 
    return View(); 
} 

Editar: Sería preferible utilizar un enfoque escrito más para recibir el publicado artículos, como arriba.

16

Si realmente sólo desea una rutina para manejar ambos verbos, intente esto:

[AcceptVerbs("Get", "Post")] 
public ActionResult ActionName(string param1, ...) 
{ 
//Fun stuff goes here. 
} 

Una posible advertencia: Estoy usando la liberación MVC 2. No estoy seguro si esto fue apoyado en MVC 1. El Intellisense la documentación de AcceptVerbs debería informarle.

+3

[AcceptVerbs (" Get "," La publicación ")] debería funcionar, ya que su constructor se define como AcceptVerbsAttribute (params string [] verbos). Se ve más ordenado. – jamiebarrow

+0

¡Gracias! Me gusta eso mejor. – mohrtan

0

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 pide confirmación, puede llamar al método GET "ConfirmDelete" y el método POST simplemente "Eliminar".

No estoy seguro si eso coincide con su situación, pero siempre me fue útil cuando tuve el mismo problema.

4

Try usando:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 
Cuestiones relacionadas