我在Items控制器上有这个动作
[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>
并且Action返回。
如果我在(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 }
);
答案 0 :(得分:0)
只要结果变量值是有效的对象/集合,您的代码就可以正常工作。如果ajax调用收到来自服务器的null
响应,那么它将转到错误回调,它会将json数据结构作为响应。由于jQuery无法将null
值转换为有效的json,因此您收到此错误。
确保您的操作方法未返回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
属性。
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?
类型作为参数,而不是读取字符串中的值并再次解析它。