Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何返回空的JSON结果?_Jquery_Json_Asp.net Mvc 4 - Fatal编程技术网

Jquery 如何返回空的JSON结果?

Jquery 如何返回空的JSON结果?,jquery,json,asp.net-mvc-4,Jquery,Json,Asp.net Mvc 4,我有一个ajax调用,它向我的一个控制器操作方法发出GET请求 ajax调用应该获得JSON响应,并使用该响应填充数据网格。回调函数应该触发并构造网格,并隐藏加载指示器 $.getJSON('@Url.Action("Data", "PortfolioManager")' + '?gridName=revenueMyBacklogGrid&loginName=@Model.currentUser.Login', function (data) {

我有一个ajax调用,它向我的一个控制器操作方法发出GET请求

ajax调用应该获得JSON响应,并使用该响应填充数据网格。回调函数应该触发并构造网格,并隐藏加载指示器

$.getJSON('@Url.Action("Data", "PortfolioManager")' + '?gridName=revenueMyBacklogGrid&loginName=@Model.currentUser.Login', function (data) {

                        ConstructrevenueMyBacklogGrid(data);
                        $('#revenueMyBacklogLoadingIndicator').hide();

                    });
问题是当我转换为JsonResult对象的对象没有数据时——它只是一个空集合

returnJsonResult=Json(portfolioManagerPortalData.salesData.myYTDSalesClients,JsonRequestBehavior.AllowGet)

在本例中,是集合
myYTDSalesClients
返回空值(这是正常且有效的-有时不会有任何数据)

JSON对象然后返回一个空响应(blank,nadda),因为它不是有效的JSON,所以回调函数不会启动。因此,加载指示器仍然显示,看起来就像永远加载一样


那么,如何返回空的JSON结果
{}
,而不是空的

使用JSON.NET作为序列化JSON的默认序列化程序,而不是默认Javascript序列化程序:

if (portfolioManagerPortalData.salesData.myYTDSalesClients == null) {
    returnJsonResult = Json(new object[] { new object() }, JsonRequestBehavior.AllowGet);
}
else {
    returnJsonResult = Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet);
}
这将处理在数据为NULL时发送数据的场景

例如

而不是在您的操作方法中:

return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet)
return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, null, null);
您需要在操作方法中写入以下内容:

return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet)
return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, null, null);
注意:上述函数中的第二个和第三个参数null是为了方便控制器类中Json方法的重载

此外,您不需要在上述所有操作方法中检查null:

        if (portfolioManagerPortalData.salesData.myYTDSalesClients == null)
        {
            returnJsonResult = Json(new object[] { new object() }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            returnJsonResult = Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet);
        }
下面是JsonNetResult类的代码

public class JsonNetResult : JsonResult
{
    public JsonSerializerSettings SerializerSettings { get; set; }
    public Formatting Formatting { get; set; }

    public JsonNetResult()
    {
        SerializerSettings = new JsonSerializerSettings();
        JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        HttpResponseBase response = context.HttpContext.Response;

        response.ContentType = !string.IsNullOrEmpty(ContentType)
          ? ContentType
          : "application/json";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting.Indented };

        JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
        serializer.Serialize(writer, Data);

        writer.Flush();
    }
}
此外,您还需要在BaseController中添加以下代码(如果项目中有):

    /// <summary>
    /// Creates a NewtonSoft.Json.JsonNetResult object that serializes the specified object to JavaScript Object Notation(JSON).
    /// </summary>
    /// <param name="data"></param>
    /// <param name="contentType"></param>
    /// <param name="contentEncoding"></param>
    /// <returns>The JSON result object that serializes the specified object to JSON format. The result object that is prepared by this method is written to the response by the ASP.NET MVC framework when the object is executed.</returns>
    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
    {
        return new JsonNetResult
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding
        };
    }
//
///创建一个NewtonSoft.Json.JsonNetResult对象,该对象将指定的对象序列化为JavaScript对象表示法(Json)。
/// 
/// 
/// 
/// 
///将指定对象序列化为JSON格式的JSON结果对象。执行此对象时,ASP.NET MVC框架将通过此方法准备的结果对象写入响应。
受保护的重写JsonResult Json(对象数据、字符串contentType、System.Text.Encoding contentEncoding)
{
返回新的JsonNetResult
{
数据=数据,
ContentType=ContentType,
ContentEncoding=ContentEncoding
};
}

从asp.net mvc 5开始,您可以简单地编写:

Json(new EmptyResult(), JsonRequestBehavior.AllowGet)

在.Net Core 3.0中,对于ControllerBase类型的控制器,可以执行以下操作:

return new JsonResult(new object());

嘿,太棒了。不幸的是,它告诉我它是无效的。它回来了。我想我需要[{}]。有什么想法吗?好吧,我是个白痴。这完全是另一回事。但是如果有人需要的话,我确实找到了[{}]这个东西……returnJsonResult=Json(新对象[]{new object()},JsonRequestBehavior.AllowGet);