Asp.Net Core Mvc上的首字母大小写的问题

  • 本次在使用的使用采用前后端开发,因此在前段已完成UI设计以及按照RAP来完成数据的模拟获取的情况下,后台返回字段出现了json数据的默认格式化。

  • 这就很头疼了,再让前端再去改明显会浪费很多的时间,因此决定解决这个问题。

  • 首先上网搜索信息,在网上只查到了asp.net webapi的解决方案,但是也为我大概指明了方向。

这是解决方案的代码:

public static class WebApiConfig {

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        // 取消注释下面的代码行可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启用查询支持。
        // 若要避免处理意外查询或恶意查询,请使用 QueryableAttribute 上的验证设置来验证传入查询。
        // 有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=279712。
        //config.EnableQuerySupport();

        // 若要在应用程序中禁用跟踪,请注释掉或删除以下代码行
        // 有关详细信息,请参阅: http://www.asp.net/web-api
        config.EnableSystemDiagnosticsTracing();



        // 干掉XML序列化器
        config.Formatters.Remove(config.Formatters.XmlFormatter);

        // 解决json序列化时的循环引用问题
        config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        // 对 JSON 数据使用混合大小写。驼峰式,但是是javascript 首字母小写形式.
        //config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new  CamelCasePropertyNamesContractResolver();
        // 对 JSON 数据使用混合大小写。跟属性名同样的大小.输出
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
    }

}
  • 我们需要做的就是将mvc的序列化装换器设置成DefaultContractResolver;

那接下来就把从Core中来实现这个问题:

  • 首先从mvc来判断应该在AddMvc方法中进行数据操作,那接下来接续为其按上述步骤设置
  1. 首先添加一个新的JsonJsonSerializerSettings,将ContractResolver 设置成DefaultContractResolver ,并将生成一个的JsonOutputFormatter格式器来存放

  2. 为了防止其他的格式器影响结构将所有的格式器,只剩下该格式器来序列化json数据。

  3. 并将新生成的JsonOutputFormatter插入到第一个。

services.AddMvc(options => { var JsonSerializerSettings = new JsonSerializerSettings(); JsonSerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; JsonSerializerSettings.ContractResolver = new DefaultContractResolver(); var jsonOutputFormatter = new JsonOutputFormatter(JsonSerializerSettings, ArrayPool<char>.Shared); options.OutputFormatters.RemoveType<JsonOutputFormatter>(); options.OutputFormatters.RemoveType<TextOutputFormatter>(); options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>(); options.OutputFormatters.Insert(0, jsonOutputFormatter); });

  • 结果返回json数据仍存在问题,这就郁闷了,经过多次测试依旧出现问题。

那就试试另一种方式:

  • 在模型类中为模型参数指明JsonProperty参数名试试,看数据是否仍旧会被格式化掉。

[JsonProperty("EntrustId")] public uint EntrustId { get; set; }

  • 结果在单一数据指明JsonProperty之后返回字段终于解决了。但是这样的方式只能是一种替代方案,在本质上仍然未解决问题,于是我决定继续解决这个问题。

按照第一次的思路来说问题应该没有问题,但是为什么不能解决问题呢。继续bing查资料吧。。。 终于找到了明灯:https://q.cnblogs.com/q/85812 额,感觉没天理了。。。

  • 问题出在Asp.Net Core 和 Asp.Net一样已经为我们集成好了这些配置。

  • 我们只需要在services.AddMvc().AddJsonOptions()中设置ContractResolver 即可。代码非常简单:

services.AddMvc().AddJsonOptions(options=>{ options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });

*这个问题花了很久时间解决,但是感觉很值,特别是看到最后的问题的时候感觉自己豁然开朗的感觉。问题很简单,但是每一步都花费了自己很多心思。

posted @ 2016-11-14 18:03  浙大城院研发中心  阅读(5104)  评论(2编辑  收藏  举报