Uncaught SyntaxError: Unexpected token < in JSON with ASP.Net WebMethod
Uncaught SyntaxError: Unexpected token < in JSON with ASP.Net WebMethod
我 运行 在我的 ASP.Net Webforms 应用程序中实施 jQuery bootgrid 时遇到问题。
我在加载页面时遇到以下问题,导致 bootgrid 无法加载数据:
Uncaught SyntaxError: Unexpected token < in JSON at position 4
at Function.parse [as parseJSON] ()
at Object.success (jquery.bootgrid.js:232)
at fire (jquery-3.1.1.js:3305)
at Object.fireWith [as resolveWith] (jquery-3.1.1.js:3435)
at done (jquery-3.1.1.js:9242)
at XMLHttpRequest.
这是我在 JavaScript:
中的 bootgrid 实现
$("#grid").bootgrid({
ajax: true,
url: "/Secure/Maintenance/Roles.aspx/GetData",
rowCount: [10, 50, 75, 100, 200, -1]
})
然后这是我的 C# WebMethod
:
[WebMethod]
public static string GetData()
{
var results = (from x in EFDB.AspNetRoles
select x).AsQueryable();
return JsonConvert.SerializeObject(results);
}
我使用了 LINQ 查询来获取数据并尝试将其转换为 JSON,但我不确定我是否做对了。当我在 GetData
方法中设置断点时,达到了 none 个断点。所以我真的很难调试它。
对我可能做错的地方有什么建议吗?
谢谢!
删除 .AsQueryable(),因为您要发送此结果进行序列化。
[WebMethod]
protected static string GetData()
{
var results = (from x in EFDB.AspNetRoles
select new
{
Id= x.Id,
Name = x.Name
});
return JsonConvert.SerializeObject(results.ToArray());
}
我最终创建了一个 Generic Handler
到 post 数据并且效果很好。这是 Generic Handler
:
的完整代码
public class RolesHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/json";
context.Response.Write(GetData());
}
public bool IsReusable
{
get
{
return false;
}
}
public string GetData()
{
var result = string.Empty;
var con = new SqlConnection();
var cmd = new SqlCommand();
var dt = new DataTable();
string sSQL = @"SELECT Id, Name
FROM dbo.AspNetRoles;";
try
{
using (var connection = THF.Models.SQLConnectionManager.GetConnection())
{
using (var command = new SqlCommand(sSQL, connection))
{
connection.Open();
command.CommandTimeout = 0;
var da = new SqlDataAdapter(command);
da.Fill(dt);
}
}
var sNumRows = dt.Rows.Count.ToString();
var sDT = JsonConvert.SerializeObject(dt);
result = "{ \"current\": 1, \"rowCount\": 10, \"rows\": " + sDT + ", \"total\": " + sNumRows + " }";
}
catch (Exception ex)
{
}
finally
{
cmd.Dispose();
THF.Models.SQLConnectionManager.CloseConn(con);
}
return result;
}
我的问题是:我使用的是 CompleteRequest 而不是 Response.End(为了避免线程中止异常):
Response.Clear();
Response.Write(Converter.ToJson(resObj));
HttpContext.Current.ApplicationInstance.CompleteRequest(); // seems to cause the problem
所以我用下面的代码替换了我的代码,令人惊讶的是,它起作用了。
try
{
Response.Clear();
Response.Write(Converter.ToJson(resObj));
Response.End();
}
catch (System.Threading.ThreadAbortException tae)
{
// ignore
}
我 运行 在我的 ASP.Net Webforms 应用程序中实施 jQuery bootgrid 时遇到问题。
我在加载页面时遇到以下问题,导致 bootgrid 无法加载数据:
Uncaught SyntaxError: Unexpected token < in JSON at position 4
at Function.parse [as parseJSON] ()
at Object.success (jquery.bootgrid.js:232)
at fire (jquery-3.1.1.js:3305)
at Object.fireWith [as resolveWith] (jquery-3.1.1.js:3435)
at done (jquery-3.1.1.js:9242)
at XMLHttpRequest.
这是我在 JavaScript:
中的 bootgrid 实现$("#grid").bootgrid({
ajax: true,
url: "/Secure/Maintenance/Roles.aspx/GetData",
rowCount: [10, 50, 75, 100, 200, -1]
})
然后这是我的 C# WebMethod
:
[WebMethod]
public static string GetData()
{
var results = (from x in EFDB.AspNetRoles
select x).AsQueryable();
return JsonConvert.SerializeObject(results);
}
我使用了 LINQ 查询来获取数据并尝试将其转换为 JSON,但我不确定我是否做对了。当我在 GetData
方法中设置断点时,达到了 none 个断点。所以我真的很难调试它。
对我可能做错的地方有什么建议吗?
谢谢!
删除 .AsQueryable(),因为您要发送此结果进行序列化。
[WebMethod]
protected static string GetData()
{
var results = (from x in EFDB.AspNetRoles
select new
{
Id= x.Id,
Name = x.Name
});
return JsonConvert.SerializeObject(results.ToArray());
}
我最终创建了一个 Generic Handler
到 post 数据并且效果很好。这是 Generic Handler
:
public class RolesHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/json";
context.Response.Write(GetData());
}
public bool IsReusable
{
get
{
return false;
}
}
public string GetData()
{
var result = string.Empty;
var con = new SqlConnection();
var cmd = new SqlCommand();
var dt = new DataTable();
string sSQL = @"SELECT Id, Name
FROM dbo.AspNetRoles;";
try
{
using (var connection = THF.Models.SQLConnectionManager.GetConnection())
{
using (var command = new SqlCommand(sSQL, connection))
{
connection.Open();
command.CommandTimeout = 0;
var da = new SqlDataAdapter(command);
da.Fill(dt);
}
}
var sNumRows = dt.Rows.Count.ToString();
var sDT = JsonConvert.SerializeObject(dt);
result = "{ \"current\": 1, \"rowCount\": 10, \"rows\": " + sDT + ", \"total\": " + sNumRows + " }";
}
catch (Exception ex)
{
}
finally
{
cmd.Dispose();
THF.Models.SQLConnectionManager.CloseConn(con);
}
return result;
}
我的问题是:我使用的是 CompleteRequest 而不是 Response.End(为了避免线程中止异常):
Response.Clear();
Response.Write(Converter.ToJson(resObj));
HttpContext.Current.ApplicationInstance.CompleteRequest(); // seems to cause the problem
所以我用下面的代码替换了我的代码,令人惊讶的是,它起作用了。
try
{
Response.Clear();
Response.Write(Converter.ToJson(resObj));
Response.End();
}
catch (System.Threading.ThreadAbortException tae)
{
// ignore
}