jQuery在Ajax中调用ASP.NET MVC C#中的Action Method
我已经尝试了几个小时才能使这个工作,我真的希望你们中的一个人知道(很多)这个比我更多。当客户端在文本框中键入时,我想调用MVC C#控制器名为updateOrder()的方法。 理想情况下,我想使用FormCollection访问表单元素(表单称为“createOrder”)。
在控制器中,我有:
C#
[WebMethod] public static void updateOrder(){ string s = "asdf"; }
上面的字符串声明是breakpointed。 在视图中,我有一个基本上复制和粘贴的方法,我在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; }
事件很简单:
JavaScript的
updateOrderJS();
触发updateOrderJS()方法(使用警报检查),但断点不会触发。
在Asp.Net MVC中,您不需要使用WebMethod
来装饰您的方法。 您只需创建一个Action(这是一个方法)并从中返回一个结果。 样品:
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); } }
在你的View
,你可以尝试这样的javascript(使用$ .ajax jquery方法 – 参见注释):
$.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'); } });
在MVC中,你不需要[WebMethod]
东西 – 你可以有一个常规的控制器动作返回一个ActionMethod
(如果你不需要返回值,则返回null)。 具有静态方法的WebMethod
属性适用于WebForms,而不适用于MVC。
public ActionMethod updateOrder(MyModel someModel) { // Do something return null; }
您在javascript中的url将是该操作的url,您可以使用@Url.Action("updateOrder", "Orders")
在Razor中获取该url,其中“订单”是您的控制器的名称。
-
确保“url”的格式为page.aspx / updateOrder 。
-
指定
datatype: json
-
确保正在调用
updateOrderJS()
。 -
确保
contentType: "application/json; charset=utf-8"
包含在内。
注意: [WebMethod]
用于调用webforms方法,而不是MVC。
看起来您将MVC路由的URL放在
标记的action
属性中。 我看不出那个属性是什么样的,因为你没有发布你的html,但从我看到的那个属性的值可能是错误的。
大多数情况下,特定MVC操作的URL是http://ServerDomain/Path(IfAny)/ControllerName/ActionName
。 例如,如果你有一个这样的控制器和动作……
public class StackController { [HttpPost] public ActionResult Overflow() { return View(); } }
…并且您的ASP.NET应用程序已部署到www.example.com,
标记的action
属性中的URL将为http://www.example.com/Stack/Overflow
。
当然,ASP.NET MVC中的其他设置可能会更改这些URL,例如global.asax的RegisterRoutes
方法中的路由设置,或者如果您的控制器分为区域。 如果您的
的URL看起来正确,请在您的ASP.NET应用程序中发布html以及任何相关的控制器路由代码。
如果您的表单位于Razor视图(cshtml文件)中,您可以使用
来生成正确的表单URL。