MVC AJAX JSON пост к методу действия контроллера - PullRequest
34 голосов
/ 08 ноября 2010

Я пытаюсь выполнить вызов JQuery AJAX для метода действия контроллера, который содержит сложный объект в качестве параметра.Я прочитал много блогов и попробовал несколько методов, извлеченных из них.Ключевым постом, на котором я построил свой код наилучшей попытки (ниже), является сообщение стека переполнения стека здесь .

Я хочу вызвать асинхронный пост, который вызывается, когда пользователь выходит из поля [не сообщение о сохранении формы - как показано в других примерах, которые я нашел].

Мое намерение заключается в следующем:

  • Создание объекта на клиенте [не ViewModel, который предоставляет тип для View];
  • Заполнить объект данными из нескольких полей в представлении;
  • Преобразовать этот объект в JSON;
  • Вызовите метод действия контроллера, используя метод jQuery.Ajax, передав объект JSON.

Результаты будут возвращены как результаты в формате JSON;и данные будут загружены в поля в представлении в зависимости от возвращаемых результатов.

Проблемы:

  • Если метод действия связан с атрибутом HttpPost, метод действия контроллера имеет видне вызывается (даже если для типа вызова AJAX установлено значение «POST»).
  • Если метод действия назначен с помощью HttpGet, значения свойств параметра равны нулю
  • Метод ReadObject выдает ошибку: «Ожидается элемент« root »из пространства имен» ». Обнаружен« None »с пространством имен« name »«».

Надеюсь, кто-нибудь может помочь.Благодарю.Код ниже:

JS-файл клиента

 var disputeKeyDataObj = {
     "InvoiceNumber": "" + $.trim(this.value) + "",
     "CustomerNumber": "" + $.trim($('#CustomerNumber').val()) + ""
  };

  var disputeKeyDataJSON = JSON.stringify(disputeHeadlineData);      

  $.ajax({
     url: "/cnr/GetDataForInvoiceNumber",
     type: "POST",
     data: disputeKeyDataJSON,
     dataType: 'json',
     contentType: "application/json; charset=utf-8",
     success: EnrichedDisputeKeyData(result)
  });


Фильтр действий и класс для типа, связанного с параметром метода действий

 [DataContract]  
 public class DisputeKeyData  
 {  
    [DataMember(Name = "InvoiceNumber")]  
    public string InvoiceNumber { get; set; }

    [DataMember(Name = "CustomerNumber")]
    public string CustomerNumber { get; set; }
 }  

Метод действия на контроллере

  //[HttpPost]
  [ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))]  
  public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData)  
  {  
     //Blah!  
     //....  
     return Json(disputeKeyData, JsonRequestBehavior.AllowGet);  
  }  

Ответы [ 3 ]

37 голосов
/ 01 декабря 2010

Ниже я понял, как это работает.

Ключевым моментом было следующее: мне нужно было использовать ViewModel, связанную с представлением, чтобы среда выполнения могла разрешать объект в запросе.

[Я знаю, что есть способ связать объект, отличный от объекта ViewModel по умолчанию, но в итоге я просто заполнил необходимые свойства для своих нужд, так как я не смог заставить его работать]*

Сценарий JQuery, используемый для вызова этого метода действия:

var requestData = {
         InvoiceNumber: $.trim(this.value),
         SelectedCompanyCode: $.trim($('#SelectedCompanyCode').val())
      };


      $.ajax({
         url: '/en/myController/GetDataForInvoiceNumber',
         type: 'POST',
         data: JSON.stringify(requestData),
         dataType: 'json',
         contentType: 'application/json; charset=utf-8',
         error: function (xhr) {
            alert('Error: ' + xhr.statusText);
         },
         success: function (result) {
            CheckIfInvoiceFound(result);
         },
         async: true,
         processData: false
      });
4 голосов
/ 11 декабря 2010

Это сообщение в блоге напрямую решает вашу проблему.

В нем используется метод без необходимости в дополнительных клиентских библиотеках JSON.Он представляет действительно простой плагин jQuery, который поможет вам в этом.

0 голосов
/ 08 ноября 2010

Какую версию asp.net mvc вы используете?Публикация объектов json в строго типизированные действия контроллера только что была добавлена ​​в ASP.NET MVC 3 Beta 1. В этой статье описывается обходной путь использования связывателей моделей для asp.net mvc 2 и информация о том, как это работает в MVC 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...