Результат Mvc 4 JSON ничего не возвращает

#jquery #asp.net-mvc #asp.net-mvc-4

#jquery #asp.net-mvc #asp.net-mvc-4

Вопрос:

У меня есть это действие на контроллере элементов

 [HttpGet]
public JsonResult Search(string data, int id)
{
    var date = DateTime.Now;
    if(!string.IsNullOrEmpty(data))
        date = DateTime.Parse(data);
    var result = Repository.FindBy(date, id); // (1)
    return Json(result, JsonRequestBehavior.AllowGet);
}
  

и я вызываю это с помощью jQuery

 function successHandler(success){
    console.log(success); // (2)
    return success;
}

function errorHandler(error){
    console.error(error); // (3)
    return error;
}

$.ajax({
    type: 'GET',
    contentType: 'application/json',
    url: '/Items/Date/2015-01-01/Id/2',
}).then(successHandler, errorHandler);
  

Если я введу точку останова в (1) и запущу вызов jQuery ajax, отладчик достигнет точки останова, я увижу, что она result является допустимой IEnumerable<Item> и что действие возвращается.

Если я введу точку останова в (2), она никогда не будет достигнута, а в (3) значение error равно

 { readyState: 4,
  responseText: "",
  status: 200,
  statusText: "OK" }
  

Что не является ошибкой.

Если я вызываю напрямую URL ( http://localhost:26252/Items/Search/2015-01-01/Id/2 ), я получаю пустую страницу и, используя консоль Firebug, тот же ответ.

Что происходит?

Редактировать:

пользовательский маршрут для этого действия

 routes.MapRoute(
    name: "Items",
    url: "Items/Date/{date}/Id/{id}",
    defaults: new { controller = "Items", action = "Search" }
);
  

и значение по умолчанию равно

 routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
  

Комментарии:

1. побочный вопрос: что это за javascript такой? Скобки просто исчезли, или это какой-то синтаксический анализатор?

2. это coffeescript. вы бы предпочли, чтобы я вставил скомпилированную версию?

3. да. пожалуйста, опубликуйте сгенерированный js. Также у вас есть пользовательский шаблон маршрута для вашего метода action?

4. Есть ли у вас настраиваемый шаблон маршрута для этого метода действия, чтобы он соответствовал URL, который вы вызываете? Каков статус этого ajax-запроса на вкладке «Сетевые инструменты разработчика» вашего браузера? Также какой ответ возвращается?

5. «Ответ, который я получаю с консоли» — это HTTP-заголовок, и он совпадает с JSON, который я ввел в свой вопрос

Ответ №1:

Ваш код должен работать нормально, если значение результирующей переменной является допустимым объектом / коллекцией. Ваш вызов ajax перейдет к обратному вызову с ошибкой, если он получит null ответ от сервера, где он ожидает структуру данных json в качестве ответа. Поскольку jQuery не удалось преобразовать null значение в допустимый json, вы получаете эту ошибку.

Убедитесь, что ваш метод action не возвращает null значение. Если он возвращает коллекцию, вы должны вернуть пустую коллекцию, когда нет данных, я лично предпочитаю обернуть ответ в другой ответ-оболочку, чтобы справиться с такого рода ситуацией.

 var result = Repository.FindBy(date, id);    
return Json(new { status="success", data=result } , JsonRequestBehavior.AllowGet);
  

Это вернет структуру JSON, подобную этой

 {
  "status":"success",
  "data": null // or a valid object/array here
}
  

Теперь в вашем обработчике успеха вы получаете доступ к data свойству после проверки null.

 successHandler = function (response) {
       if(response.status==="success")
       { 
          if(response.data!=null)
          {
            console.log(success);
            return success;
          }
          else
          {
            console.log('data is null. may be no data for your filter');
          }
       }
};
  

Кроме того, вы могли бы рассмотреть возможность использования DateTime? типа для вашего параметра вместо чтения значения в строке и повторного его анализа.