我有一个按钮点击触发的函数,它通过以下参数: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调试模式指示某种循环引用错误。我不太确定我哪里出错了。
谢谢!
答案 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}
}