對 MVC 的輸入進行轉換。。

2021-08-29 01:20:44 字數 2727 閱讀 5291

這兒說了一下不修改資料庫也不修改太多**的情況下將數字加密的問題,(適應於json)

現在問題來了,客戶端傳回來的也是加密後的字串。。。噗通。。

繫結到 int 型別的屬性,。

伺服器端直接報 model validate 出錯。。

所以,伺服器端還需要乙個反轉的過程;

mvc 有很多地方可以對於上傳的值進行處理;

例如最簡單的 formvalueprovider,   

不過這些 valueprovider 很明顯不適合,因為它們返回的是字串,此時還沒有引數型別;

自定義乙個 newtonsoftjsonvalueprovide***ctory 當然也不行,原因同上;

所以,只能在 構建了 valueprovider 之後, 並在模型驗證之前 進行處理;

asp.net mvc 預設使用 defaultmodelbinder 進行模型繫結,定義乙個此類的繼承類,

當然,你不嫌麻煩也可以自己寫 imodelbinder 介面的實現類,我是懶人;

裡面有一堆的方法,直觀來看,覆蓋

protected virtual void setproperty(controllercontext controllercontext, modelbindingcontext bindingcontext, propertydescriptor propertydescriptor, object value) 

但是,實際一測試,這個時候傳入進來的 value 已經是 null 了;

那麼下面這個方法呢。。

protected override object getpropertyvalue(controllercontext controllercontext, modelbindingcontext bindingcontext, propertydescriptor propertydescriptor, imodelbinder propertybinder)

protected override object getpropertyvalue(controllercontext controllercontext, modelbindingcontext bindingcontext, propertydescriptor propertydescriptor, imodelbinder propertybinder)

}var result = base.getpropertyvalue(controllercontext, bindingcontext, propertydescriptor, propertybinder);

return result;

}

嗯,貌似很好; get, post, 都能夠正確的把   partnerid=b8feb9b3db27f6d0d3204774b353d6e2" 

這樣的傳入引數轉換回 partnerid=123;

完整走一遍單元測試,噗通噗通噗通的錯誤冒出來了。。

get下這樣的引數不支援:

post下這樣的引數不支援:

testx[partnerid]:b8feb9b3db27f6d0d3204774b353d6e2

json下這樣的引數不支援:

}  很明細 bindingcontext.valueprovider.getvalue(propertydescriptor.name) 這個無法獲取到類似於 

propertydescriptor.name 這個值始終為 partnerid , 所以獲取到null 了;

propertydescriptor 這個裡面的 convert 為唯讀,-- 否則自己寫乙個 typeconvert 貌似很簡單解決這個問題;

好吧,我構建乙個 propertydescriptor 然後使用 

base.getpropertyvalue(controllercontext, bindingcontext, propertydescriptor, propertybinder) 去獲取不久行了麼。。

再一看, propertydescriptor 抽象類,實際類為   reflectpropertydescriptor,好吧;

俺就使用 reflectedparameterdescriptor, 仔細一看 reflectedparameterdescriptor建構函式需要乙個 parameterinfo 引數,

而 parameterinfo 確是 protected 的。。。

貌似太麻煩了。。

再看看有沒有其他屬性。。發現乙個 

protected override object getpropertyvalue(controllercontext controllercontext, modelbindingcontext bindingcontext, propertydescriptor propertydescriptor, imodelbinder propertybinder)

}var result = base.getpropertyvalue(controllercontext, bindingcontext, propertydescriptor, propertybinder);

return result;

}

這個系列的文章說的比較細,但是**實用價值太少;

可以看看。。。

對repeater繫結的資料進行轉換

需求 repeater控制項已經繫結了這個 的資料,現在要將status欄位在頁面輸出時顯示對應的文字。1 對應輸出 未審核 2 對應輸出 審核通過 3 對應輸出 審核失敗 方法 先建立乙個類庫,接著建立乙個類,在裡面寫入方法 如下 public static string getstatus in...

Python學習 對輸入的數字進行排序

要求,輸入一串數字,並以列表的形式列印出來。number input 請輸入一串數字 print number print type number 假設輸入12345,得到結果如下 請輸入一串數字 12345 12345 可以看出,變數number型別為字串型別。將其轉換成列表,如下所示 print...

Python對輸入的數進行氣泡排序

寫在最後的話 這裡是一段防爬蟲文字,請讀者忽略。本文原創首發於csdn,作者idys 部落格首頁 對使用者的非法輸入進行提示和程式退出 讓使用者能夠結束數字的輸入,然後對數字排序 第一輪 在氣泡排序中,首先將第1個數與第2個數進行排序,如果第1個數大於第2個數,那麼交換。然後繼續比較第2個數與第3個...