【问题标题】:JSON object mapping issue in MVC 6MVC 6 中的 JSON 对象映射问题
【发布时间】:2015-10-25 05:18:52
【问题描述】:

我发布了一个非常简单的 JSON 对象。 WebApi 端点成功命中,但我传递的 JSON 数据似乎没有映射到我的 Dto 对象,我总是得到空值。这在以前的 MVC 版本中可以正常工作。我已经尝试了几件事,甚至添加了 [FromBody],正如在类似帖子中所建议的那样。知道为什么这不起作用吗?谢谢

角度服务:

app.service('Issue', [ '$resource',
function($resource) {
    return $resource('api/issue', {}, {
        save : { method: 'POST', url: 'api/issue/save' }
    });
}]);

角度调用:

Issue.save({ id: 1, test: "test_string"  });
Issue.save({ Id: 1, Test: "test_string"  }); //this call works if I remove the camel case settings from the startup

Dto 对象:

public class IssueMinDto {
    public int Id { get; set; }
    public string Test { get; set; }
}

WebAPI 方法:

[HttpPost("save")]
public void SaveIssue([FromBody]IssueMinDto issue) { //issue is null here
    //process data
}

稍后编辑:如果我从启动中删除驼峰式设置(下面的设置)并且我在调用中使用大写首字母,那么它可以工作,但这是不可接受的,因为我的所有数据整个应用程序都基于该初始设置(小写首字母)。在我当前的设置中,我有什么可以改进的地方吗?

启动设置 - 应该在这里解决问题:

services.AddMvc().Configure<MvcOptions>(options => {
            options.InputFormatters.Clear();
            var jsonOutputFormatter = new JsonOutputFormatter();
            jsonOutputFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            options.OutputFormatters.Insert(0, jsonOutputFormatter);
        });

稍后编辑

原来我的启动设置中的以下代码行导致了这个问题:

options.InputFormatters.Clear();

我用以下行替换了设置,现在一切正常:

options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

【问题讨论】:

  • 你能看到发送到服务器的请求吗?是否设置了正确的参数?
  • 不应该是IdTest才能正确绑定吗? (或者,public int idpublic int test
  • 我也尝试过使用大写的首字母,但没有成功。此外,这在以前的 MVC 版本上运行良好。
  • @lrb: 我用 fiddler 来检查,在 composer 中拖动请求时,我可以在请求正文中看到 {"Id":1,"Test":"test_string"}

标签: angularjs asp.net-core asp.net-core-mvc


【解决方案1】:

原来我的启动设置中的以下代码行导致了这个问题:

options.InputFormatters.Clear();

我用以下行替换了设置,现在一切正常:

options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

【讨论】:

    【解决方案2】:

    几乎,Json 参数必须等于 C# 参数

    Issue.save({ Id: 1, Test: "test_string"});
    

    更新 1

    尝试用$http改变$resource

    app.service('Issue', ['$http', function ($http) {
        this.save = function (data) {
            return $http.post('api/issue/save', data );
        }
    }]);
    

    【讨论】:

    • 这不起作用。我试过强制刷新(清除缓存)。如果有帮助,我已经用我的启动配置更新了主题描述。
    • 感谢您的回答。关于更新 1:我在这里发布问题之前尝试使用 $http ,但仍然无法正常工作。但是,我只是尝试从启动中注释掉骆驼大小写设置,如果我按照你的建议使用大写字母,它可以工作(这意味着我的角度是正确的) - 但这意味着我必须在整个应用程序中使用大写首字母,这恐怕不是一个选择。我还尝试在设置打开的情况下在两端使用小写字母。这也不起作用。
    • 我想通了,我已经用以下行替换了我的设置:options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    • 有趣的是我今天学到了一些关于 MVC6 的新东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多