ASP MVC contrôleur de l'action "404 not found" erreur lors de l'décorées avec [HttpPost]
J'ai un contrôleur de l'action méthode qui fonctionne quand il ressemble à ceci:
public ActionResult testMethod(int id)
{
//do something...
//return something...
return View();
}
Mais quand je précise qu'il faut un "Post" la méthode, j'ai une erreur 404 not found':
[HttpPost]
public ActionResult testMethod(int id)
{
//do something...
//return something...
return View();
}
J'ai d'autres contrôleur de méthodes d'action dans le même contrôleur - POST et GET, et qu'ils fonctionnent très bien. Mais celui-ci ne l'est pas? Ce qui se passe? (Je suis sûr que je suis absent quelque chose d'évident ici...)
Mise à jour:
Un appel ajax demandes de la méthode de contrôleur:
var id = 1;
$.ajax({
url: '/indices/testMethod/',
data: id,
type: 'POST',
success: function (data) {
//Do something
}
});
J'ai aussi essayé de tester la méthode avec le Facteur, s'assurer de la requête POST est envoyé.
Mise à jour 2:
J'ai essayé de changer le paramètre id, et a essayé de s'assurer de méthode et url emplacements immobilisée de match, mais sans aucun effet.
Dans un violon, je peux voir qu'en fait une demande est faite, même si je spécifier une requête POST à l'appel ajax, donc maintenant j'ai besoin de savoir pourquoi la demande finit par être envoyé comme un GET au lieu de POST.
J'ai aussi essayé d'inclure un attribut de la description de l'itinéraire, à l'instar de ce
[HttpPost]
[Route("indices/TestMethod/{id:int}")]
public ActionResult TestMethod(int id)
Et a ensuite essayé de l'appel ajax avec une url différente:
$.ajax({
url: '/indices/TestMethod/1',
data: id,
type: 'POST',
success: function (data) {
var tr = 123;
var yr = data;
//Do something
}
});
Avec l'attribut de routage, et le paramètre de la valeur dans l'URL, je vois dans un violon que d'abord une requête POST arrive, qui obtient une 301 statut de l'erreur, mais alors une requête GET est, qui obtient le message d'erreur 404.
Mise à jour 3:
Après plusieurs recherches, j'ai rétréci la définition du problème de manière suffisante qu'il fait sens pour ouvrir une nouvelle question, qui peut être trouvé ici:
ASP MVC, jQuery $.ajax requête POST n'appelle pas la méthode du contrôleur, mais travaille en "frais" projet MVC
Le problème semble être causé par le Contenu de paramètres de Stratégie de Sécurité qui ont été actif pour ce projet.
- comment avez-vous essayer de contacter cette action?
- Êtes-vous sûr que la demande est après communique à l'action, et non pas une autre verbe? Installez le Violoneux et d'examiner les données de la demande.
- ont ajouté quelques informations supplémentaires - pour autant que je sais, une requête POST est envoyé, mais il n'atteint jamais le contrôleur que j'ai une erreur 404.
- Utiliser un violon pour voir ce qui est réellement envoyé. Vous avez peut-être l'appel de l'URL erronée - vous à l'aide d'une url relative à la racine, et non pas la page en cours. Si votre site est hébergé, par exemple, dans
http://someroot/somesubsite
, votre code d'appelhttp://someroot/indices/testMethod/
, pashttp://someroot/somesubsite/indices/testMethod
- Vous pouvez éviter URL ambiguïtés en utilisant @Html.ActionLink pour générer la cible de l'ULR en fournissant le contrôleur et l'action des noms
- vous êtes de passage dans la param1 paramètre, car il est requis?
- Si vous modifiez le
type
àGET
dans votre dernier exemple et utiliser la même URL dans jQuery, la méthode est alors appelé? Et avez-vous essayé d'utiliser$.post
au lieu de$.ajax
, juste pour être sûr de ne pas manquer d'aucune configuration supplémentaire? - Quand j'ai changer le type à OBTENIR et à utiliser la même URL, la méthode est appelée. À l'aide de $.post au lieu de 4.ajax ne fonctionne toujours pas.
- Ok, as-tu essayé avec le
FromBody
-attribut du paramètre? Merci de voir mon jour de réponse. - avez-vous essayé de données : {id:1};
- Avez-vous trouver une solution?
Vous devez vous connecter pour publier un commentaire.
Essayez de changer
param1
àid
et voir si cela fonctionne. Cela peut sembler stupide, mais en fait, je l'ai connu votre problème avant moi et qui a résolu le problème.L'autre question, je pense que dans votre application,
testMethod
's path est/Indices/TestMethod
avec des caractères en majuscules. Et lorsque vous demandez/indices/testMethod/
il pourrait y avoir une redirection qui se passe ce qui résulte en uneGET
demande.D'essayer de changer le
url
dans votre appel ajax ou essayer d'ajouter un[Route()]
attribut pour définir le nom de la route.Vous pourriez avoir besoin d'ajouter de la
FromBody
-attribut de laint param1
-paramètre que c'est un type simple? Voir ici pour plus d'info.Sinon un itinéraire dans le format
/indices/testMethod/{param1}
est prévu (c'est à dire param est nécessaire pour être dans l'URL, même si c'est un POST de demande). Cet itinéraire peut ne pas être définie, c'est à dire dans votreglobal.asax.cs
. Vous pouvez essayer de faire un POST de demande de/indices/testMethod/1
par exemple. Juste pour essayer si c'est vraiment un problème de routage?Dans le cas où vous avez des problèmes avec votre routage, vous pouvez définir un itinéraire spécifique pour votre méthode à l'aide de Attribut De Routage. Au moins pour les tests et le développement, car cela rend plus facile de voir/comprendre la route est en fait défini pour votre méthode.
Quelques questions supplémentaires pour affiner, ce que l'on pourrait en fait être:
dataGoesHere
-objet?global.asax.cs
)?Mise à jour
Je voudrais essayer suivantes:
Définir la méthode du contrôleur comme ceci:
Définir l'action de l'appeler comme ceci:
Soit essayer de passer le
id
comme une valeur simple ou essayer de la passer en un objet avec unid
-propriété (voir le commentaire ci-dessus).param1
n'est pasUrlParameter.Optional
, alors je rekon que la route pour la méthode n'a pas de match,/indices/testMethod/
(sans param) est appelée.FromBody
à la déclaration de paramètre peut être nécessaire de forcer un moyen de paramètres de liaison sur l'autre quand il est ambigu de l'endroit où le paramètre doit venir. Peu importe si le paramètre est un simple ou de type complexe, cela peut venir de l'organisme sansFromBody
. L'attribut ne pouvait qu'affecter la valeur du paramètre observé à partir de la méthode appelée, pas la capacité de localiser la méthode, en principe.