web-dev-qa-db-fra.com

jQuery pour appeler la méthode d'action dans ASP.NET MVC C # par Ajax

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.

8
user4855057

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');
    }
});
19
Felipe Oriani

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.

3
Joe Enos
  1. Assurez-vous que "url" est au format page.aspx/updateOrder .

  2. Spécifiez datatype: json

  3. Assurez-vous que votre updateOrderJS() est appelé.

  4. Assurez-vous que contentType: "application/json; charset=utf-8" est inclus.

Remarque: [WebMethod] est utilisé pour appeler des méthodes webforms, pas MVC.

0
garryp

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.

0
Joshua Carmody