我有一个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对象然后返回一个空响应(空白,nadda),因为它不是有效的JSON,回调函数不会触发。因此,加载指示器仍然显示,看起来它只是永远加载。
那么,如何返回空的JSON结果{}
而不是空白?
答案 0 :(得分:13)
if (portfolioManagerPortalData.salesData.myYTDSalesClients == null) {
returnJsonResult = Json(new object[] { new object() }, JsonRequestBehavior.AllowGet);
}
else {
returnJsonResult = Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet);
}
答案 1 :(得分:9)
从asp.net mvc 5开始,你可以简单地写一下:
Json(new EmptyResult(), JsonRequestBehavior.AllowGet)
答案 2 :(得分:0)
使用JSON.NET作为默认的Serializer来序列化JSON而不是默认的Javascript Serializer:
如果数据为NULL,这将处理发送数据的情况。
例如
而不是在你的行动方法中:
return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet)
你需要在你的行动方法中写下这个:
return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, null, null);
注意:上述函数中的第2和第3个参数null是为了方便Controller类中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
};
}
答案 3 :(得分:0)
在.Net Core 3.0中,对于ControllerBase类型的控制器,您可以执行以下操作:
return new JsonResult(new object());