Подтвердить что ты не робот

MVC ajax json post для метода действия контроллера

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

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

Я намерен:

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

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

Проблемы:

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

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

Клиентский файл 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);  
  }  
4b9b3361

Ответ 1

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

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

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

[HttpPost]  
  public ActionResult GetDataForInvoiceNumber(MyViewModel myViewModel)  
  {            
     var invoiceNumberQueryResult = _viewModelBuilder.HydrateMyViewModelGivenInvoiceDetail(myViewModel.InvoiceNumber, myViewModel.SelectedCompanyCode);
     return Json(invoiceNumberQueryResult, JsonRequestBehavior.DenyGet);
  }

JQuery script используется для вызова этого метода действий:

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

Ответ 2

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

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

Ответ 3

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