【问题标题】:Mvc 4 JsonResult not returning anythingMvc 4 JsonResult没有返回任何东西
【发布时间】:2016-10-21 14:35:40
【问题描述】:

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

【问题讨论】:

  • 附带问题:那是什么类型的 javascript?括号是否消失了,还是某种解析器?
  • 这是咖啡脚本。您希望我粘贴编译后的版本吗?
  • 是的。请发布生成的js。您的操作方法还有自定义路由模板吗?
  • 您是否为此操作方法设置了自定义路由模式以匹配您正在调用的 url?您的浏览器开发工具网络选项卡中此 ajax 请求的状态是什么?还有什么反应回来?
  • “我从控制台得到的响应”是 HTTP 标头,与我在问题中输入的 JSON 相同

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


【解决方案1】:

只要结果变量值是有效的对象/集合,您的代码就应该可以正常工作。如果您的 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
}

现在在您的成功处理程序中,您可以在 null 检查后访问 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? 类型作为参数,而不是读取字符串中的值并再次解析。

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2019-04-22
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多