我只是想将一个简单的模型发送回我的控制器来更新一个对象。出于某种原因,这让我感到厌烦。
控制器方法:
[Authorize(Roles = Enums.Roles.SiteAdmin)]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "BuildingId,Name")] Building building)
{
if (ModelState.IsValid)
{
service.Update(building);
return Json(new { Status = "Success!" });
}
return Json(new { Status = "error." });
}
EF模型:
public class Building
{
[Key()]
public int BuildingId { get; set; }
[Required()]
[MaxLength(200)]
public string Name { get; set; }
public virtual ICollection<Room> Rooms { get; set; }
}
Javascript post方法:
$('.saveOnBlur').on('blur', function (e) {
var newBuildingName = $(this).prop("innerText");
var editBuildingId = $(this).siblings('.hiddenId').children().first().val();
var modifiedBuilding = { BuildingId: Number(editBuildingId), Name: newBuildingName };
$.ajax({
url: "/Equipment/Buildings/Edit",
type: 'POST',
contentType: 'application/json',
data: { building: JSON.stringify(modifiedBuilding) }
});
})
我不知道自己做错了什么。我能够使用非常类似的方法创建对象,但是这个代码甚至没有达到控制器方法,我只是立即得到内部错误500(而不是404)。有什么想法吗?
答案 0 :(得分:1)
您必须进行调试。它可能是ValidateAntiForgeryToken
,如果您没有提供有效值,它将在它到达您的代码之前停止。我没有看到任何包含http标头中的值的javascript代码。
故障排除评论,看看它是否符合方法。如果没有尝试下一个过滤器,它是您的授权过滤器,看看是否导致您的代码无法执行。
如果你已经有代码来处理通过ajax发送的令牌了,如果没有,那么很多以前的问题在SO上有很好的答案,这些问题描述了如何通过创建一个读取它的修改后的ValidateAntiForgeryTokenAttribute
来做到这一点来自http标题。
需要检查的其他事项。
data: JSON.stringify(modifiedBuilding)
/Equipment/Buildings/Edit
。您可以在问题中提供路由配置,以便更轻松。答案 1 :(得分:0)
我几次遭遇同样的错误。
通常,如果在控制器启动时甚至没有遇到断点而出现500错误,则在将请求路由到控制器之前会出现故障。
主要嫌疑人:
1 - 路由配置错误。所以500正在发生,因为你没有适当的参数路径
2 - Model不接受空数据,因此在将数据传递给控制器之前解析数据会失败
3 - 自定义过滤器失败