web-dev-qa-db-de.com

jQuery zum Aufrufen der Aktionsmethode in ASP.NET MVC C # von Ajax

Ich habe stundenlang versucht, dies zum Laufen zu bringen, und ich hoffe wirklich, dass einer von Ihnen (ziemlich viel) mehr darüber weiß als ich. Wenn der Client sich in einem Textfeld befindet, möchte ich den MVC C # -Controller nennen Methode namens updateOrder (). Im Idealfall möchte ich mit einer FormCollection auf Formularelemente zugreifen (das Formular heißt "createOrder"). 

In der Steuerung habe ich:

C #

[WebMethod]
public static void updateOrder(){
    string s = "asdf";
}

Die String-Deklaration oben ist mit einem Breakpoint versehen. In der Ansicht habe ich eine Methode, die ich im Grunde kopiert und eingefügt habe, die ich bei stackoverflow gefunden habe:

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;
}

Die Veranstaltung ist einfach:

JavaScript

updateOrderJS();

Die updateOrderJS () -Methode wird ausgelöst (mit einer Warnung geprüft), der Haltepunkt jedoch nicht.

8
user4855057

In Asp.Net MVC müssen Sie Ihre Methode nicht mit WebMethod dekorieren. Sie erstellen einfach eine Aktion (eine Methode) und geben ein Ergebnis davon zurück. Für probe:

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

Und in Ihrer View können Sie ein solches Javascript versuchen (mit der Methode $ .ajax jquery - siehe die Kommentare):

$.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

In MVC benötigen Sie nicht das [WebMethod]-Zeug - Sie können nur eine reguläre Controller-Aktion mit einer ActionMethod (oder null, wenn Sie keinen Rückgabewert benötigen) zurückgeben. Das WebMethod-Attribut mit statischen Methoden gilt für WebForms und nicht für MVC.

public ActionMethod updateOrder(MyModel someModel) {
    // Do something
    return null;
}

Ihre URL im Javascript wäre die URL zu dieser Aktion, die Sie in Razor mit @Url.Action("updateOrder", "Orders") aufrufen können, wobei "Orders" der Name Ihres Controllers ist.

3
Joe Enos
  1. Stellen Sie sicher, dass "url" das Format page.aspx/updateOrder hat.

  2. datatype: json angeben

  3. Stellen Sie sicher, dass Ihre updateOrderJS() aufgerufen wird.

  4. Stellen Sie sicher, dass contentType: "application/json; charset=utf-8" enthalten ist.

Hinweis: [WebMethod] wird zum Aufrufen von Webforms-Methoden und nicht von MVC verwendet.

0
garryp

Es sieht so aus, als würden Sie die URL der MVC-Route in das action-Attribut Ihres <form>-Tags einfügen. Ich kann nicht sehen, wie dieses Attribut aussieht, weil Sie Ihre HTML-Datei nicht veröffentlicht haben, aber der Wert dieses Attributs ist möglicherweise falsch.

Die URL zu einer bestimmten MVC-Aktion lautet meistens http://ServerDomain/Path(IfAny)/ControllerName/ActionName. Wenn Sie zum Beispiel einen Controller und eine solche Aktion haben ...

public class StackController
{
    [HttpPost]
    public ActionResult Overflow()
    {
        return View();
    }
}

Wenn Ihre ASP.NET-Anwendung auf www.example.com bereitgestellt wird, lautet die URL im action-Attribut Ihres <form>-Tags http://www.example.com/Stack/Overflow

Natürlich können andere Einstellungen in Ihrer ASP.NET-MVC diese URLs ändern, z. B. das Einrichten der Route in Ihrer RegisterRoutes-Methode von global.asax oder möglicherweise, wenn Ihre Controller in Bereiche unterteilt sind. Wenn die URL Ihres <form> richtig aussieht, geben Sie die HTML-Datei zusammen mit dem entsprechenden Controller-Routing-Code in Ihrer ASP.NET-App an.

Wenn sich Ihr Formular in einer Razor-Ansicht (cshtml-Datei) befindet, können Sie mit <form action="@Url.Action({ controller = "ControllerName", action = "ActionName" })" method="post"> die richtige Formular-URL generieren.

0
Joshua Carmody