XML解析错误:在ASP.NET Core 2.0 API中找不到根元素

时间:2018-03-04 15:51:50

标签: ajax asp.net-mvc asp.net-core asp.net-core-mvc

我遇到过这个问题,我无法理解。我正在使用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,或单个元素正在工作!)
  •   

3 个答案:

答案 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()