Mvc 4 JsonResult没有返回任何东西

时间:2016-10-21 14:35:40

标签: jquery asp.net-mvc asp.net-mvc-4

我在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 }
);

1 个答案:

答案 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?类型作为参数,而不是读取字符串中的值并再次解析它。