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.
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');
}
});
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.
Stellen Sie sicher, dass "url" das Format page.aspx/updateOrder hat.
datatype: json
angeben
Stellen Sie sicher, dass Ihre updateOrderJS()
aufgerufen wird.
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.
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.