我遇到过这个问题,我无法理解。我正在使用ASP.NET Core 2和Ajax。
这是JavaScript调试器所说的:
XML解析错误:找不到根元素位置: http://localhost:52617/api/favorites/第1行,第1列:
这是我的JavaScript代码:
$(".js-toggle-fav").click(function (e) {
function sendPost() {
console.log("inside post send");
var button = $(e.target);
$.ajax({
type: 'POST',
url: "http://localhost:52617/api/Favorites/",
data: {"EventId": @Model.Event.EventId},
contentType: "application/json; charset=utf-8"
});
}
$.getJSON("http://localhost:52617/api/favorites/@Model.Event.EventId", function (data) {
if (data == null) {
console.log("fav is null");
sendPost();
fav.addClass(toggling);
fav.text("unfav");
}
else {
console.log("fav is NOT null");
sendPost();
fav.removeClass(toggling);
fav.text("fav");
}
);
});
我的API:
[HttpPost]
public async Task<IActionResult> PostFavorite([FromBody] FavoriteDto favorite)
{
if (!ModelState.IsValid)
{
Console.WriteLine(ModelState.ValidationState.ToString());
return BadRequest(ModelState);
}
var uid = _userManager.GetUserId(HttpContext.User);
var fav = await _context.Favourites.SingleOrDefaultAsync(x => x.EventId == favorite.EventId && x.UserId == uid);
if (fav == null)
{
_context.Favourites.Add(new Favorite { EventId = favorite.EventId, UserId=uid });
}
else
{
_context.Favourites.Remove(fav);
}
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (FavoriteExists(favorite.EventId))
{
return new StatusCodeResult(StatusCodes.Status409Conflict);
}
else
{
throw;
}
}
return Ok(favorite);
}
当我使用Postman或任何restclient时,一切都像魅力一样!使用Ajax,情况并非如此。
注意:
- 在同一个
.cshtml
文件中,有更多jQuery和JavaScript代码执行类似这样的操作,而且它只是工作!所有的解决方案 不幸的是,我在互联网上检查过没有用。- Get方法(用于返回List,或单个元素正在工作!)
答案 0 :(得分:2)
问题来自
DoWordk
不要直接传入,而是使用JSON.Stringify
status_image.setImageResource(if(runningState == RunningState.FAST) R.drawable.ic_run_fast else R.drawable.ic_walk)
我假设你的FavoriteDto类看起来像这样
data: {"EventId": @Model.Event.EventId},
您收到xml错误的原因是控制器操作
var payload = {EventId: @Model.Event.EventId};
$.ajax({
type: 'POST',
url: "http://localhost:52617/api/Favorites/",
data: JSON.stringify(payload),
contentType: "application/json; charset=utf-8"
});
无法解析'收藏',因此它从未初始化并且为空。然后返回ok(null),当它从服务器收到响应时,在客户端ajax上导致解析错误。
答案 1 :(得分:1)
我在DELETE
调用ASP.Net Core 2.1 Web API时遇到此错误。我从[FromBody]
调用所期望的模型中删除了DELETE
,例如
public async Task<IActionResult> Delete(MyModel body)
{
// Just an example
await DoSomeWork(body);
return StatusCode(200);
}
但是并不能解决问题。但是,在我返回了StatusCode
的一些内容之后,在这个示例中,该内容只是一个简单的字符串,错误消失了。因此,以下代码应避免Firefox中的错误:
public async Task<IActionResult> Delete(MyModel body)
{
// Just an example
await DoSomeWork(body);
return StatusCode(200, "Deletion Successfull");
}
答案 2 :(得分:0)
要添加到其他答案中,如果jQuery ajax在期望有效JSON或根本没有内容的地方得到一个空字符串响应,也会发生此错误。
在data
回调中检查done
的值,如果它是空字符串""
而不是undefined
,则必须修复服务器以返回状态代码204 (No Content)
而不是没有内容的200 (OK)
。
在WebAPI2中,这意味着返回StatusCode(HttpStatusCode.NoContent)
而不是Ok()
。