J'ai essayé pendant des heures pour que cela fonctionne, et j'espère vraiment que l'un d'entre vous en saura (beaucoup plus) que moi à ce sujet. Lorsque le client entre dans une zone de texte, j'aimerais appeler le contrôleur MVC C # méthode appelée updateOrder (). Idéalement, j'aimerais accéder aux éléments de formulaire avec un FormCollection (le formulaire s'appelle "createOrder").
Dans le contrôleur, j'ai:
C #
[WebMethod]
public static void updateOrder(){
string s = "asdf";
}
La déclaration de chaîne ci-dessus est un point d'arrêt. Dans la vue, j'ai une méthode que j'ai copiée et collée que j'ai trouvée sur stackoverflow:
JavaScript
function updateOrderJS() {
var $form = $('form[id="createOrder"]');
$.ajax({type : "POST",
url : $form.attr('action'),
data : $form.serialize(),
error : function(xhr, status, error) {},
success : function(response) {
updateOrder();
}
});
return false;
}
L'événement est simplement:
JavaScript
updateOrderJS();
La méthode updateOrderJS () se déclenche (vérifiée avec une alerte), mais pas le point d'arrêt.
Dans Asp.Net MVC, vous n'avez pas besoin de décorer votre méthode avec WebMethod
. Vous créez simplement une action (qui est une méthode) et vous en retournez un résultat. Comme échantillon:
public class CustomerController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult UpdateOrder()
{
// some code
return Json(new { success = true, message = "Order updated successfully" }, JsonRequestBehavior.AllowGet);
}
}
Et dans votre View
, vous pouvez essayer un javascript comme ceci (en utilisant la méthode $ .ajax jquery - voir les commentaires):
$.ajax({
url: '@Url.Action("UpdateOrder")', // to get the right path to controller from TableRoutes of Asp.Net MVC
dataType: "json", //to work with json format
type: "POST", //to do a post request
contentType: 'application/json; charset=utf-8', //define a contentType of your request
cache: false, //avoid caching results
data: {}, // here you can pass arguments to your request if you need
success: function (data) {
// data is your result from controller
if (data.success) {
alert(data.message);
}
},
error: function (xhr) {
alert('error');
}
});
Dans MVC, vous n'avez pas besoin de la substance [WebMethod]
- vous pouvez simplement avoir une action régulière du contrôleur renvoyant une ActionMethod
(ou null si vous n'avez pas besoin d'une valeur de retour). L'attribut WebMethod
avec les méthodes statiques est destiné à WebForms, pas à MVC.
public ActionMethod updateOrder(MyModel someModel) {
// Do something
return null;
}
Votre URL dans le javascript serait l'URL de cette action, que vous pouvez obtenir dans Razor à l'aide de @Url.Action("updateOrder", "Orders")
, où "Orders" est le nom de votre contrôleur.
Assurez-vous que "url" est au format page.aspx/updateOrder .
Spécifiez datatype: json
Assurez-vous que votre updateOrderJS()
est appelé.
Assurez-vous que contentType: "application/json; charset=utf-8"
est inclus.
Remarque: [WebMethod]
est utilisé pour appeler des méthodes webforms, pas MVC.
On dirait que vous mettez l'URL de la route MVC dans l'attribut action
de votre balise <form>
. Je ne peux pas voir à quoi ressemble cet attribut parce que vous n'avez pas posté votre code HTML, mais d'après ce que je peux voir, la valeur de cet attribut est peut-être fausse.
La plupart du temps, l'URL d'une action MVC spécifique est http://ServerDomain/Path(IfAny)/ControllerName/ActionName
. Par exemple, si vous avez un contrôleur et une action comme celle-ci ...
public class StackController
{
[HttpPost]
public ActionResult Overflow()
{
return View();
}
}
... et que votre application ASP.NET est déployée sur www.example.com, l'URL dans l'attribut action
de votre balise <form>
serait http://www.example.com/Stack/Overflow
.
Bien entendu, il est possible que d'autres paramètres de votre ASP.NET MVC modifient ces URL, tels que la configuration de l'itinéraire dans la méthode RegisterRoutes
de votre global.asax, ou peut-être si vos contrôleurs sont divisés en zones. Si l'URL de votre <form>
semble correct, publiez le code HTML avec le code de routage du contrôleur approprié dans votre application ASP.NET.
Si votre formulaire se trouve à l'intérieur d'une vue Razor (fichier cshtml), vous pouvez utiliser <form action="@Url.Action({ controller = "ControllerName", action = "ActionName" })" method="post">
pour générer l'URL de formulaire correcte.