it-roy-ru.com

jQuery для вызова метода действия в ASP.NET MVC C # от Ajax

Я часами пытался заставить это работать, и я очень надеюсь, что кто-то из вас (чертовски много) знает об этом больше, чем я. Когда клиент вводит текстовое поле, я хотел бы вызвать контроллер MVC C # метод с именем updateOrder (). В идеале я хотел бы получить доступ к элементам формы с помощью FormCollection (форма называется «createOrder»). 

В контроллере у меня есть:

C #

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

Объявление строки выше имеет точку останова. По моему мнению, у меня есть метод, который я в основном копирую и вставляю, который нашел в 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 () срабатывает (проверяется с помощью предупреждения), а точка останова - нет.

8
user4855057

В Asp.Net MVC вам не нужно украшать свой метод с помощью WebMethod. Вы просто создаете действие (которое является методом) и возвращаете результат из него. Для образца:

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

В MVC вам не нужен материал [WebMethod] - у вас может быть обычное действие контроллера, возвращающее ActionMethod (или ноль, если вам не нужно возвращаемое значение). Атрибут WebMethod со статическими методами предназначен для WebForms, а не для MVC.

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

Ваш URL в javascript будет URL-адресом этого действия, которое вы можете получить в Razor с помощью @Url.Action("updateOrder", "Orders"), где «Orders» - это имя вашего контроллера.

3
Joe Enos
  1. Убедитесь, что «url» имеет формат page.aspx/updateOrder .

  2. Укажите datatype: json

  3. Убедитесь, что ваша updateOrderJS() вызывается.

  4. Убедитесь, что contentType: "application/json; charset=utf-8" включен.

Примечание: [WebMethod] используется для вызова методов webforms, а не MVC.

0
garryp

Похоже, вы помещаете URL-адрес маршрута MVC в атрибут action вашего тега <form>. Я не вижу, как выглядит этот атрибут, потому что вы не опубликовали свой HTML, но из того, что я вижу, значение этого атрибута может быть неправильным.

В большинстве случаев URL-адрес определенного действия MVC - это http://ServerDomain/Path(IfAny)/ControllerName/ActionName. Например, если у вас есть контроллер и такие действия ...

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

... и ваше приложение ASP.NET развернуто на www.example.com, URL-адрес в атрибуте action вашего тега <form> будет http://www.example.com/Stack/Overflow

Разумеется, другие параметры в вашем ASP.NET MVC могут изменять эти URL-адреса, такие как настройка маршрута в методе RegisterRoutes вашего global.asax или, возможно, если ваши контроллеры разделены на области. Если URL-адрес вашего <form> выглядит правильно, пожалуйста, опубликуйте html вместе с любым соответствующим кодом маршрутизации контроллера в приложении ASP.NET.

Если ваша форма находится внутри представления Razor (файл cshtml), вы можете использовать <form action="@Url.Action({ controller = "ControllerName", action = "ActionName" })" method="post"> для создания правильного URL-адреса формы.

0
Joshua Carmody