Проблема передачи данных JSON с помощью jQuery $ .ajax () в действие .NET MVC с пользовательской BindingModel - PullRequest
3 голосов
/ 24 июня 2009

Я пытаюсь передать данные JSON из клиентского браузера в действие ASP.NET MVC с помощью jQuery $ .ajax () и связать их с классом .NET с помощью пользовательского ModelBinder.

КЛИЕНТ JAVASCRIPT:

$('#btnPatientSearch').click(function() {

  var patientFilter = {
    LastName: 'Flinstone',
    FirstName: 'Fred'
  };

  var jsonData = $.toJSON(patientFilter);

  $.ajax({
    url: '/Services/GetPatientList',
    type: 'GET',
    cache: false,
    data: jsonData,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    timeout: 10000,
    error: function() {
      alert('Error loading JSON=' + jsonData);
    },
    success: function(jsonData) {
      $("#patientSearchList").fillSelect(jsonData);
    }
  });

КЛАСС .NET ДЛЯ ДАННЫХ JSON

[ModelBinder(typeof(JsonModelBinder))]
public class PatientFilter
{

  #region Properties

  public string IDNumber { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string SSN { get; set; }
  public DateTime DOB { get; set; }

  #endregion
}

Действие MVC

  public JsonResult GetPatientList(iPatientDoc.Models.PatientFilter patientFilter)
  {

ПОЛЬЗОВАТЕЛЬСКИЙ МОДЕЛЬБИНДЕР

public class JsonModelBinder : IModelBinder
{
  #region IModelBinder Members

  public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    if (controllerContext == null)
      throw new ArgumentNullException("controllerContext");
    if (bindingContext == null)
      throw new ArgumentNullException("bindingContext");

    var serializer = new DataContractJsonSerializer(bindingContext.ModelType);
    return serializer.ReadObject(controllerContext.HttpContext.Request.InputStream);
  #endregion

  }
}

Пользовательский ModelBinder вызывается правильно, но Request.InputStream пуст, поэтому нет данных для привязки к объекту PatientFilter.

Любые мысли приветствуются. Chris

1 Ответ

4 голосов
/ 24 июня 2009

Некоторые мысли по этому поводу

  • Вы используете запрос GET. Я думаю, что тело запроса всегда пусто для GET
  • Ваш класс PatientFilter не имеет атрибута [DataContract]. Я не уверен, что это что-нибудь сериализует
  • Я не уверен в вашем $.ajax() звонке. Я ожидал, что опция данных просто возьмет объект вместо строки JSON. Посмотрев документацию , я бы попытался установить для параметра processData значение false.

Также есть интересное описание для опции данных:

Данные для отправки на сервер. Он преобразуется в строку запроса, если это еще не строка. Он добавляется в URL для GET-запросов. См. Параметр processData, чтобы предотвратить эту автоматическую обработку. Объект должен быть парой ключ / значение. Если значение является массивом, jQuery сериализует несколько значений с одинаковым ключом, т.е. {foo: ["bar1", "bar2"]} становится '& foo = bar1 & foo = bar2'.

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