2017-05-10 1 views
0

J'ai un contrôleur MVC, lié à une vue 'Create'. Je voudrais avoir une méthode 'GET', afin de faire un peu de pré-traitement et afficher la vue, puis une méthode 'POST', afin de mettre à jour la base de données en conséquence. Après avoir lu quelques guides, et des réponses sur SO, je pense que quelque chose comme ce qui suit est la bonne solution.Comment rendre les méthodes GET et POST de WebAPI-MVC non ambiguës

<HttpGet> 
    Public Function Create() As ActionResult 
     'Do Stuff 
     Return View(New MyClass) 
    End Function 

    <HttpPost> 
    Public Function Create(MyObject As MyClass) As ActionResult 
     'Process results 
    End Function 

Cependant, lorsque je tente d'accéder http://my.site/MyController/Create, je reçois une exception:

System.Reflection.AmbiguousMatchException: The current request for action 'Create' on controller type 'MyControllerController' is ambiguous 

Comme si le moteur ne pouvait pas décider entre les deux, même si elles sont marquées publierez.

Qu'est-ce que je fais mal ici?

+0

Il n'y a rien de mal avec le code que vous avez posté, je serais enclin à être d'accord avec la réponse d'Erik, ou il y a une autre raison pour laquelle l'attribut est pas réellement appliqué. Aussi, FWIW, il est inutile de spécifier 'HttpGet'. C'est le défaut. –

+0

@ChrisPratt - ce n'est pas exactement la valeur par défaut. C'est plus comme un fourre-tout. Si vous ne spécifiez pas de verbe, il sera utilisé pour tous les verbes. Ainsi, vous pouvez spécifier soit obtenir ou poster, mais vous devez avoir une différenciation sur l'un d'entre eux. –

Répondre

2

Plus que probable que vous utilisez le mauvais attribut. MVC et WebApi utilisent le même nom d'attribut pour HttpGet et HttpPut, mais ils sont dans des espaces de noms différents.

Pour MVC:

System.Web.Mvc.HttpGetAttribute 

Pour WebAPI:

System.Web.Http.HttpGetAttribute 

Si vous utilisez le mauvais (en utilisant l'attribut MVC avec WebAPI ou vice versa, il est ignoré, et vous obtiendrez la message d'erreur que vous avez mentionné Assurez-vous d'avoir le bon espace de noms

+0

La modification de ''' '' a fait l'affaire. Merci beaucoup. – Maxime

0

Vous ne pouvez pas surcharger les méthodes du contrôleur. Ce que vous pouvez probablement faire si vous voulez vraiment voulez garder les noms d'action même est ci-dessous:

<ActionName("Save")> 
<HttpPost> 
Public Function Create(MyObject As MyClass) As ActionResult 
    'Process results 
End Function 
+0

"Vous ne pouvez pas surcharger les méthodes du contrôleur." Ce n'est pas vrai. Vous pouvez * beaucoup * surcharger des actions. Ils doivent simplement utiliser des méthodes HTTP différentes, car sinon, le cadre de routage ne peut pas faire la distinction entre quand acheminer vers l'un ou l'autre. –