#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?
типа для вашего параметра вместо чтения значения в строке и повторного его анализа.