2013-08-08 1 views
3

У меня возникла проблема с использованием JQuery AJAX в качестве запроса GET. По какой-то причине связующее устройство ASP.NET MVC, похоже, не может привязываться к элементу фильтра. То, что происходит, вызывается результат действия, но создается пустой объект.привязка модели ASP.NET MVC не работает с AJAX GET, но работает с Post

Однако, если я перехожу из HTTP Get to HTTP Post, тогда он работает. Зачем это было? Из того, что я понимаю, было бы лучше использовать GET, поскольку данные не изменяются на сервере.

Вот усеченную версию моего кода:

AJAX:

$.ajax({ 
    url: url, 
    contentType: 'application/json', 
    dataType: 'json',    
    type: "GET", 
    data: "{'filter':" + ko.toJSON(model.filter) + "}", 
    error: function (xhr, textStatus, errorThrown) { 

    }, 
    success: function (returnedData) { 

    } 

ActionResult:

[HttpGet] 
public virtual ActionResult Index(IFilter filter) 
{ 
    ViewModel filteredViewModel = GetFilteredViewModel(filter); 

    if (Request.IsAjaxRequest()) 
    { 
     return toJSON(filteredViewModel); 
    } 

    return View(filteredViewModel); 
} 

Фильтр:

public class Filter: IFilter 
{  
    public Nullable<DateTime> LogDate { get; set; }   
    public Nullable<int> SpecificItem_ID { get; set; } 
} 
+2

Это потому, что 'GET' имеет некоторые ограничения при публикации' Route Parameters (Query String) '. 'GET' не будет работать с публикацией сложных параметров. –

+0

Можете ли вы опубликовать код для метода toJSON? – ataravati

+0

Извините, я не могу, так как это просто функция KnockoutJS toJSON Однако я могу показать вам тип создаваемого JSON: {"logDate": "01/08/2013", "specificItem_ID": null "} –

ответ

5

Во-первых, просто чтобы очистить неправильные представления, POST не имеет значения изменение, обязательно. Это совершенно справедливо для запроса через POST при доступе к «функции» из-за отсутствия лучшего слова. Например:

# Request 
POST /add-xy 
{ "x": 2, "y": 2 } 

# Response 
200 OK 
4 

Ничего не изменилось, но POST по-прежнему является наиболее подходящим HTTP-глаголом.

Это говорит о принципиальной разнице между запросами GET и POST, а именно концепцией POST «body». Тело POST может иметь тип контента и, следовательно, может быть правильно интерпретировано на стороне сервера как JSON, XML и т. Д. С GET все, что у вас есть, - это запрос, который является просто строкой.

Проблема, с которой вы сталкиваетесь, заключается в том, что с помощью GET фильтр «объект» является просто строкой, и поскольку строка не реализует IFilter, модель-связыватель не может ее связать. Однако через POST фильтр «объект» отправляется в тело POST с соответствующим типом контента. Таким образом, modelbinder принимает его как JSON и сопоставляет объект JSON с реализацией IFilter.

Мораль в том, что GET жизнеспособна только для простых запросов - с данными, которые в значительной степени являются только парами имен и значений простых типов. Если вам необходимо передать фактические объекты, вам необходимо использовать POST.

-1

Я не знаю, почему это было принято, но принятый в настоящее время ответ абсолютно неверен.

ModelBinders не связывают отправленные параметры, если ваше имя объекта точно равно filter. Поэтому измените имя объекта и он будет правильно связываться.

 Смежные вопросы

  • Нет связанных вопросов^_^