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(); });

*這個問題花了很久時間解決,但是感覺很值,特別是看到最后的問題的時候感覺自己豁然開朗的感覺。問題很簡單,但是每一步都花費了自己很多心思。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM