为什么我的帖子方法没有击中控制器?

时间:2016-11-10 20:04:30

标签: c# jquery asp.net ajax asp.net-mvc

我只是想将一个简单的模型发送回我的控制器来更新一个对象。出于某种原因,这让我感到厌烦。

控制器方法:

    [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)。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您必须进行调试。它可能是ValidateAntiForgeryToken,如果您没有提供有效值,它将在它到达您的代码之前停止。我没有看到任何包含http标头中的值的javascript代码。

故障排除评论,看看它是否符合方法。如果没有尝试下一个过滤器,它是您的授权过滤器,看看是否导致您的代码无法执行。

如果你已经有代码来处理通过ajax发送的令牌了,如果没有,那么很多以前的问题在SO上有很好的答案,这些问题描述了如何通过创建一个读取它的修改后的ValidateAntiForgeryTokenAttribute来做到这一点来自http标题。

需要检查的其他事项。

  1. 将数据有效负载更改为data: JSON.stringify(modifiedBuilding)
  2. 检查您的路线/Equipment/Buildings/Edit。您可以在问题中提供路由配置,以便更轻松。

答案 1 :(得分:0)

我几次遭遇同样的错误。

通常,如果在控制器启动时甚至没有遇到断点而出现500错误,则在将请求路由到控制器之前会出现故障。

主要嫌疑人:

1 - 路由配置错误。所以500正在发生,因为你没有适当的参数路径

2 - Model不接受空数据,因此在将数据传递给控制器​​之前解析数据会失败

3 - 自定义过滤器失败