【问题标题】:"Incorrect Content-Type: " exception throws angular mvc 6 application“不正确的内容类型:”异常抛出 angular mvc 6 应用程序
【发布时间】:2016-02-16 03:35:16
【问题描述】:

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

  • 表单'((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()});

}

【问题讨论】:

  • 对此有何改进?
  • 不,但这有效var eventObj = JsonConvert.DeserializeObject<Event>(Request.Form["event"]); 角度服务返回$http({ url: 'Home/CreateEvent', method: "POST", data: $.param({ event: JSON.stringify(event) }), headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(deffered.resolve).error(deffered.reject);

标签: c# angularjs asp.net-mvc


【解决方案1】:

接受的答案对我不起作用。对我来说,解决方案是在 $http 调用中添加一个标头:

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

【讨论】:

    【解决方案2】:

    希望以下示例对您有所帮助。

    尝试用

    来装饰你的控制器
    [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# 视图模型

    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>
    

    结果

    【讨论】:

    • 复杂对象也可以。即:公共类 LoginViewModel { 公共字符串电子邮件 { 获取;放; } 公共字符串密码 { 获取;放; } public List MyOtherViewModel{get;set} } 只要你的js对象有相同的属性名和属性名。 var data = { Email: 'Test', Password: 'Test', RememberMe: true MyOtherViewModel :[{ PropertyName:"whatever" },{PropertyName:Whatever2},{PropertyName:"somethingelse"}] };
    【解决方案3】:

    在我的例子中,添加[Produces("application/json")] 没有任何作用,但是将[FromBody] 属性添加到参数中就可以了!

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 2019-01-01
        • 2015-10-27
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多