第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模型上的 IDictionary 屬性拋出 System.InvalidCastException

模型上的 IDictionary 屬性拋出 System.InvalidCastException

C#
慕工程0101907 2023-08-20 10:09:10
我有一個數(shù)據(jù)庫模型,它將設(shè)置存儲為 32 位整數(shù)上的位.HasFlag。前端使用 AngularJs (1),遺憾的是它不允許在表達(dá)式中進(jìn)行按位運(yùn)算。因此,我創(chuàng)建了一個擴(kuò)展方法,用于從枚舉轉(zhuǎn)換為每個標(biāo)志的字典以及它是否打開:public static IDictionary<TEnum, bool> GetAllFlags<TEnum>(this TEnum obj) where TEnum: Enum{    return Enum.GetValues(typeof(TEnum))        .Cast<TEnum>()        .ToDictionary(flag => flag, flag => obj.HasFlag(flag));}我還創(chuàng)建了一個擴(kuò)展方法來設(shè)置值,但它依賴于其他擴(kuò)展方法,并且不會被調(diào)用(如下所述),因此為了簡潔起見,我將省略它們。這是正在使用的枚舉的示例(請注意,它的類型默認(rèn)為int并且只有很少的選項(xiàng),但它確實(shí)定義了一個0奇怪的類型)public enum Settings{    None = 0,    Setting1 = 1,    Setting2 = 2,    Setting3 = 4,}所有這些都作為對象的屬性公開,如下所示// SettingsFlags comes from another partial and is a Settings enum persisted to the database as an `INT`public parital class Options{    IDictionary<Settings, bool> Flags {        get { return SettingsFlags.GetAllFlags(); }        set { SettingsFlags.SetAllFlags(value); } // this never gets called    }}JSON當(dāng)為客戶端序列化時,這非常有效。但是,當(dāng)在請求中收到它時,它會拋出以下異常:System.InvalidCastException: Specified cast is not valid.   at System.Web.Mvc.DefaultModelBinder.CollectionHelpers.ReplaceDictionaryImpl[TKey,TValue](IDictionary`2 dictionary, IEnumerable`1 newContents)當(dāng)進(jìn)入調(diào)試器時,該get塊被調(diào)用并返回預(yù)期的字典。之后,調(diào)試器中無需執(zhí)行任何其他步驟即可引發(fā)錯誤。以下是端點(diǎn)的示例(不符合 REST 標(biāo)準(zhǔn)):public JsonResult UpdateSingleItem(Options options, ...){ // breakpoint here is never called.    ....}`使用ReSharperwithDotPeak檢查代碼為我提供了引發(fā)錯誤的方法的以下信息:// System.Web.Mvc.DefaultModelBuilder.CollectionHelpersprivate static void ReplaceDictionaryImpl<TKey, TValue>(  IDictionary<TKey, TValue> dictionary,  IEnumerable<KeyValuePair<object, object>> newContents){  dictionary.Clear();  foreach (KeyValuePair<object, object> newContent in newContents)    {    TKey key = (TKey) newContent.Key;    TValue obj = newContent.Value is TValue ? (TValue) newContent.Value : default (TValue);    dictionary[key] = obj;  }}
查看完整描述

1 回答

?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊

我不能確定,但我猜測客戶端正在將枚舉作為字符串值發(fā)送?


{

"Setting1":true,

"Setting2":false

}

這將失敗,因?yàn)槟J(rèn)綁定試圖將該字符串轉(zhuǎn)換回枚舉。如果它傳回枚舉的整數(shù)值而不是字符串,我認(rèn)為這會起作用。如果您獲取字符串值,那么您可能需要創(chuàng)建自定義模型綁定程序。


查看完整回答
反對 回復(fù) 2023-08-20
  • 1 回答
  • 0 關(guān)注
  • 131 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號