内部服务器错误ajax提交

时间:2017-12-08 18:28:46

标签: javascript c# jquery asp.net ajax

我有一个按钮点击触发的函数,它通过以下参数:insertSongPlay(newSong.songID);当我调试时。newSong.songID我看到值90,这是所需的。

此处调用此函数,该函数运行ajax调用:

function insertSongPlay(songID)

{
    $.ajax
    ({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: "/Album/InsertSongPlay/",
        data: JSON.stringify({ "songID": songID }),
        success: function(data)
        {

            console.log("submitted");
            console.log(songID);
            //TODO: Indicate Success
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            //TODO: Indicate Error
            console.log(errorThrown);
        }
    });
}

这是我在AlbumController中找到的相应的ajax网址:

public JsonResult InsertSongPlay(int songID)
{
    try
    {
        EntityDataAccess.InsertSongPlay(songID);
        return Json(true);
    }
    catch(Exception ex)
    {
        return Json(ex);
    }
}

然后在我的EntityDataAccess.cs中,从InsertSongPlay实体数据访问运行以下内容:

public static SongPlayDaily InsertSongPlay(int songID)
{
    using(var Context = GetContext())
    {
        var currentSongPlay = Context.SongPlayDailies.FirstOrDefault(x => x.SongID == songID && x.PlayDate == DateTime.Now.Date);
        if (currentSongPlay != null)
            currentSongPlay.NumberOfPlays++;
        else
        {
            currentSongPlay = new SongPlayDaily();
            currentSongPlay.SongID = songID;
            currentSongPlay.PlayDate = DateTime.Now.Date;
            currentSongPlay.NumberOfPlays = 1;
            Context.SongPlayDailies.Add(currentSongPlay);
        }
        Context.SaveChanges();
        return currentSongPlay;
    }
}

但是,我的ajax调用总是抛出错误并将Internal Server Error输出到控制台日志。 Visual Studio调试模式指示某种循环引用错误。我不太确定我哪里出错了。

谢谢!

3 个答案:

答案 0 :(得分:1)

正如我们在评论中所指出的那样 - 这里存在多个问题。首先,

return Json(ex);

是个坏主意。这将检查异常的所有属性,并尝试将它们以及这些属性的所有属性序列化为json。如你所见,这不顺利,也完全没必要。如果要将错误响应返回给客户端 - 准备它(例如,使用ex.Message)。此外,您不希望在每次错误时向您的客户返回感性信息(如堆栈跟踪)。

除此之外 - 在异常时执行return Json() - 违反了HTTP约定。 Json()将返回状态代码为200的响应。但在你的情况下,它不是真的" ok" - 所以你应该返回另一个指示错误的状态代码。如果不是那个循环引用错误 - 你的代码在ajax"错误"处理程序永远不会被触发,即使确实存在错误。

最简单的修复方法就是完全删除try-catch,让框架为你处理。

第二个问题是

x.PlayDate == DateTime.Now.Date

在查询中过滤。实体框架在访问Date对象的DateTime属性时存在问题,并拒绝将其转换为SQL查询。您可以将其移动到另一个变量:

var today = DateTime.Now.Date;
Where(x => x.PlayDate == today)

或使用DbFunctions.TruncateTime

Where(x => x.PlayDate == DbFunctions.TruncateTime(DateTime.Now))

请注意,这些方式并不完全相同。首先将与确切的日期值进行比较,然后第二个将使用SQL SYSDATETIME()函数。在这种情况下,这几乎不重要。

答案 1 :(得分:0)

是不是因为您错过了控制器操作的[HttpPost]属性?

[HttpPost]
public JsonResult InsertSongPlay(int songID)
{ 
    try
    {
        EntityDataAccess.InsertSongPlay(songID);
        return Json(true);
    }
    catch(Exception ex)
    {
        return Json(ex);
    }   
}

答案 2 :(得分:0)

在后期操作中,您应该使用复杂类型来接收来自客户端的数据。

试试这个

[HttpPost]
public JsonResult InsertSongPlay(SongModel songModel)
{ 
    try
    {
        EntityDataAccess.InsertSongPlay(songModel.songID);
        return Json(true);
    }
    catch(Exception ex)
    {
        return Json(ex);
    }   
}

public class SongModel{
    public int songID {get;set}
}