2016-11-10 127 views
0

我只是想发送一个简单的模型回我的控制器来更新一个对象。出于某种原因,这是在逃避我。为什么我的发布方法不能击中控制器?

控制器的方法:

[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

您能提供您收到的错误消息吗? – Dabbas

+0

@Dabbas从F12工具的控制台:jquery-2.1.3.min.js:4 POST http:// localhost:55698/Equipment/Buildings/Edit 500(内部服务器错误) –

+0

没有其他任何反应 –

回答

1

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

要对其进行注释并查看它是否符合该方法。如果不尝试使用您的授权过滤器的下一个过滤器,并查看是否导致您的代码不被执行。

如果你已经有处理通过ajax发送的令牌的代码,如果不是,那么很多以前的问题都有很好的答案,它们描述了你如何做到这一点,比如创建一个修改后的ValidateAntiForgeryTokenAttribute,它从http头。


其他的事情来检查。

  1. 变化的数据有效载荷data: JSON.stringify(modifiedBuilding)
  2. 检查你的路线以及/Equipment/Buildings/Edit。您可以在问题中提供路由配置,以使其更容易。
+0

把他们两个都解决不了。 :/ –

+0

@eddie_cat - 将数据载荷更改为data:JSON.stringify(modifiedBuilding) – Igor

+0

@eddie_cat - 并检查您的路线以及/ Equipment/Buildings/Edit。您可以在问题中提供路由配置,以使其更容易。 – Igor

0

我几次遭受同样的错误。

一般来说,当您在控制器启动时没有碰到断点的情况下发生500错误时,在请求路由到您的控制器之前,某些内容会失败。

主要嫌疑人为:

1 - 路由配置错误。因此,500发生,因为你没有对参数的适当途径

2 - 型号不接受空数据,因此它被传递给你的控制器之前,你的数据解析失败

3 - 一个自定义过滤器失败

相关问题