問題: 還是升級到3.1的問題,直接上圖,現象如下: 我們的系統里,有一些查詢條件是從枚舉轉化過來的,但是為了統一,界面渲染的時候追加了一個“請選擇”,value為-999,這種場景很多很多, 可以看到-999不在枚舉的定義里,只要我以當前選擇狀態提交請求,後端全局的modal valid就會報錯, ...
問題:
還是升級到3.1的問題,直接上圖,現象如下:
我們的系統里,有一些查詢條件是從枚舉轉化過來的,但是為了統一,界面渲染的時候追加了一個“請選擇”,value為-999,這種場景很多很多,
可以看到-999不在枚舉的定義里,只要我以當前選擇狀態提交請求,後端全局的modal valid就會報錯,說-999不是有效的值。
這個情況在我之前2.1裡面不存在的,升級到3.1就這樣了。
調查:
我同事也在看,居然在github里有人提過這樣的issue:https://github.com/dotnet/aspnetcore/issues/14824
官方說了,在3.1裡面,不管這個參數了。
完了我們去看看3.1版本下,這個枚舉綁定器的源碼吧:https://github.com/dotnet/aspnetcore/blob/v3.1.2/src/Mvc/Mvc.Core/src/ModelBinding/Binders/EnumTypeModelBinder.cs
仔細看他裡面說的很清楚,不在枚舉的定義範圍內,綁定的值,全都無效的,方法會返回fasle,然後checkmodel就會爆error。此邏輯的初衷的確是好的,因為綁定更嚴謹了,新項目可以嘗試遵守下。
解決:
1. 要麼我改前端,但是想想還是算了,好多地方都用。
2. 自己重寫一個,因為IsDefinedInEnum方法被它定義成私有的了,本想著可以擴展,想想還是重新寫了,代碼如下:
模型綁定三板斧-xxxModelBinder:
模型綁定三板斧-xxxModelBinderProvider:
模型綁定三板斧-替換:
至此,就適配了這個問題