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方法中进行数据操作,那接下来接续为其按上述步骤设置
-
首先添加一个新的JsonJsonSerializerSettings,将ContractResolver 设置成DefaultContractResolver ,并将生成一个的JsonOutputFormatter格式器来存放
-
为了防止其他的格式器影响结构将所有的格式器,只剩下该格式器来序列化json数据。
-
并将新生成的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(); });
*这个问题花了很久时间解决,但是感觉很值,特别是看到最后的问题的时候感觉自己豁然开朗的感觉。问题很简单,但是每一步都花费了自己很多心思。