這個(gè)問題是在某個(gè).net framework項(xiàng)目遷移至netcore時(shí)遇到的,現(xiàn)象就是在向前端傳遞數(shù)據(jù)的時(shí)候仆潮,前端出現(xiàn)了大量屬性u(píng)ndefined铃在,也就是說這些屬性并沒有獲取到值。
在原項(xiàng)目中拇泣,前端解析時(shí)使用了與model一樣的屬性名稱,正常來說應(yīng)該是沒有問題的矮锈。
經(jīng)過測試霉翔,我們發(fā)現(xiàn)前端收到的數(shù)據(jù)中,屬性名稱發(fā)生了改變苞笨,名稱不對(duì)應(yīng)導(dǎo)致了無法獲取值和對(duì)象债朵,也就會(huì)出現(xiàn)undefined這種值。那么剩下的問題就是為什么這個(gè)名稱會(huì)改變瀑凝,以及能否讓他保持不變序芦。
網(wǎng)上摸了下,發(fā)現(xiàn)這問題也被很多人吐槽過了粤咪,如:https://github.com/aspnet/Mvc/issues/4842
可以看到谚中,netcore的序列化會(huì)把名稱默認(rèn)轉(zhuǎn)化成camelCase格式,即屬性名稱發(fā)生了改變寥枝。
https://dotnetcoretutorials.com/2017/01/02/pascalcase-vs-camelcase-asp-net-core/
從上面這篇文章也可以看到宪塔,該默認(rèn)格式出現(xiàn)在netcore1.0版本。
因此除了通過更改前端屬性名稱來解決問題外囊拜,上面的鏈接中也給出了保持原樣的解決辦法某筐,稍作設(shè)置即可:
services.AddMvc().AddJsonOptions(x =>
{
x.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy
{
ProcessDictionaryKeys = false // this is the default.
}
};
});
這串設(shè)置是鏈接提供的方法,但是復(fù)制過去之后艾疟,并沒有能夠保持原樣来吩。看了下里面的設(shè)置蔽莱,發(fā)現(xiàn)NamingStrategy 的定義是:
那么設(shè)置成CamelCaseNamingStrategy似乎就不是個(gè)理想選擇弟疆。因此改成DefaultNamingStrategy ,收工盗冷。