web-dev-qa-db-fra.com

poster et obtenir avec la même signature de méthode

Dans mon contrôleur, j'ai deux actions appelées "Amis". Celui qui s'exécute dépend de savoir si c'est un "get" ou un "post".

Ainsi, mes extraits de code ressemblent à ceci:

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

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

Cependant, cela ne compile pas car j'ai deux méthodes avec la même signature (Friends). Comment puis-je créer cela? Dois-je créer une seule action, mais différencier un "get" et un "post" à l'intérieur? Si oui, comment je fais ça?

51
codette

Renommez la seconde méthode en quelque chose d'autre comme "Friends_Post" et vous pourrez ensuite ajouter l'attribut [ActionName("Friends")] à la seconde. Ainsi, les demandes de l'action Friend avec POST comme type de demande seront traitées par cette action.

// 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();
}
113
Çağdaş Tekin

Si vous voulez vraiment qu'une seule routine gère les deux verbes, essayez ceci:

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

Un bémol potentiel: j'utilise la version 2 de MVC. Je ne sais pas si cela a été pris en charge dans MVC 1. La documentation Intellisense pour AcceptVerbs devrait vous en informer.

20
mohrtan

Essayez d'utiliser:

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

Marquer la réponse de Cagdas comme étant la réponse puisqu'elle a répondu à ma question. Cependant, comme je n'aime pas utiliser l'attribut ActionName dans mon projet, j'utilise une solution différente. J'ai simplement ajouté FormCollection à l'action "post" (qui finit par changer la signature de la méthode)

// 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();
}
2
codette

pas tout à fait sûr si c'est la bonne façon, mais j'utiliserais un paramètre sans signification pour différencier les signatures. comme:

// 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();
}

Je sais que c'est moche et hack, mais ça marche.

2
Ariel

ajoutez à la méthode Post les paramètres à recevoir dans la publication. peut-être comme ça:

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

..ou si vous avez un type complexe, comme ceci:

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

Edit: Il serait préférable d'utiliser une approche plus typée pour recevoir les éléments postés, comme ci-dessus.

1
Matt Kocaj

Vos méthodes d'action ne peuvent pas faire la même chose, sinon il ne serait pas nécessaire d'écrire deux méthodes d'action. Donc, si la sémantique est différente, pourquoi ne pas utiliser également des noms différents pour les méthodes d'action? 

Par exemple, si vous avez une méthode d'action "delete" et que GET vous demande simplement une confirmation, vous pouvez appeler la méthode GET "ConfirmDelete" et la méthode POST simplement "Supprimer". 

Je ne sais pas si cela correspond à votre scénario, mais cela m'est toujours arrivé lorsque j'ai eu le même problème. 

0
Adrian Grigore