“不正确的内容类型:”异常抛出angular mvc 6应用程序

时间:2015-11-14 18:08:57

标签: c# angularjs asp.net-mvc

我正在使用asp.net,mvc6和angularjs在我的角度服务上开发一个应用程序。当我向动作方法发出请求时,我没有传递数据。 当我检查了请求时,我可以看到由以下原因引起的异常:

  
      
  • Form'((Microsoft.AspNet.Http.Internal.DefaultHttpRequest)this.Request).Form'   抛出了类型的例外   'System.InvalidOperationException'Microsoft.AspNet.Http.IFormCollection   {System.InvalidOperationException}
  •   

异常消息"Incorrect Content-Type:application/json;charset=UTF-8"

我的角色服务

return $http({ method: 'POST', url: 'home/createEvent', eventDetails: event })
                .success(function(data, status, headers, config) {
                    return data;
                })
                .catch(function(data, status, headers, config) {
                    console.log(data);
                });

在我的控制器上

[HttpPost]
public IActionResult CreateEvent([FromBody]Event eventDetails)
{
    return Json(new {dsd=""},
        new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()});

}

4 个答案:

答案 0 :(得分:6)

希望以下示例可以帮助您。

尝试使用

装饰您的控制器
[Produces("application/json")]
[Route("api/[controller]")]

由于你不会显示你的控制器名称,我会给你一个虚构的完整工作例子

控制器

[Produces("application/json")]
[Route("api/[controller]")]    
public class DashBoardLayoutApi : Controller
{
    public DashBoardLayoutApi()
    { }

    [HttpPost]
    public void Post([FromBody] LoginViewModel data)
    { }
}

C#viewmodel

public class LoginViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
}

HTML / JS

<script>
    var data = {
        Email: 'Test',
        Password: 'Test',
        RememberMe: true
    };

    $("#test").click(function() {
        $.ajax({
            url: '/api/DashBoardLayoutApi',
            type: 'POST',
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(data),                   
        });
    }
</script>
<button id="test"> Save Layout</button>

结果

enter image description here enter image description here

答案 1 :(得分:4)

接受的答案对我没有用。对我来说,解决方案是在$ http调用中添加标题:

        $http({
                url: "/install",
                method: "POST",
                data: data,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded"
                }
            })
            .success(...);

答案 2 :(得分:0)

隐藏的答案很棒。但是,即使我在我的应用程序中实现了隐藏的方法,我仍然在C#控制器中有空模型。在挖掘了一下后,我发现问题出在JS代码中创建的不正确的客户端模型中,无法在服务器上反序列化(null无法转换为类型Guid)。

出于某种原因,模型绑定器在这种情况下不会抛出异常: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

  

绑定参数时,模型绑定将停止查找具有该名称的值,并继续绑定下一个参数。如果绑定失败,MVC不会抛出错误。您可以通过检查ModelState.IsValid属性来查询模型状态错误。

因此,检查C#控制器中的ModelState.IsValid属性以确保传递了有效模型,并考虑使用自定义模型绑定器来捕获模型绑定错误并记录它们。

答案 3 :(得分:0)

在我的情况下,添加[Produces("application/json")]并没有任何作用,但是在参数中添加[FromBody]属性是解决问题的方法!