亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NetMVC的ViewBag一個坑,不要跳進去

2019-11-14 14:19:30
字體:
來源:轉載
供稿:網友

   如鵬的學習管理系統是使用asp.net MVC 5開發的,今天一個新版本發布后網站出現一個Bug,學生在下拉列表中選中的項再加載顯示的時候發現仍然沒被選中。詳細一點說吧:
假如有這樣一個Action:

public ActionResult Index(){List<SelectListItem> persons = new List<SelectListItem>(); persons.Add(new SelectListItem { Text = "騰訊", Value = "QQ" });persons.Add(new SelectListItem { Text = "如鵬", Value = "rupeng", Selected = true });ViewBag.persons = persons;return View();}

  Cshtml是這樣的:

@Html.DropDownList("persons", (IEnumerable<SelectListItem>)ViewBag.persons)
生成的html是這樣的:

<select id="persons" name="persons"><option value="qq">騰訊</option><option value="rupeng">如鵬</option></select>

   竟然第二項沒有處于選中狀態,太詭異了吧!

  只要把DropDownList第二個參數的"persons"改成和”ViewBag.persons”的persons名字不一樣就可以,比如:
@Html.DropDownList("persons1", (IEnumerable<SelectListItem>)ViewBag.persons)
   這樣就正確生成了:

<select id="persons1" name="persons1"><option value="qq">騰訊</option><option selected="selected" value="rupeng">如鵬</option></select>

  

   好詭異!??!


   咋辦?看源碼!
   DropDownList是定義在SelectExtensions擴展類中,DropDownList方法最終是調用SelectInternal方法,核心代碼是這一段:

if (!flag && obj == null && !string.IsNullOrEmpty(name)){obj = htmlHelper.ViewData.Eval(name);}if (obj != null){selectList = SelectExtensions.GetSelectListWithDefaultValue(selectList, obj, allowMult
PRivate static IEnumerable<SelectListItem> GetSelectListWithDefaultValue(IEnumerable<SelectListItem> selectList, object defaultValue, bool allowMultiple){IEnumerable enumerable= new object[]{defaultValue};IEnumerable<string> collection = from object value in enumerableselect Convert.ToString(value, CultureInfo.CurrentCulture);HashSet<string> hashSet = new HashSet<string>(collection, StringComparer.OrdinalIgnoreCase);List<SelectListItem> list = new List<SelectListItem>();foreach (SelectListItem current in selectList){current.Selected = ((current.Value != null) ? hashSet.Contains(current.Value) : hashSet.Contains(current.Text));list.Add(current);}return list;}

  

注意,我們的List<SelectListItem>()集合被當成defaultValue參數傳遞給GetSelectListWithDefaultValue方法了(why?),在方法內部又把defaultValue給 Convert.ToString()一下,變成了”System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]”這么一個玩意, GetSelectListWithDefaultValue的主要邏輯就是查找selectList中等于”System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]”的值,能找到才算見了鬼呢!?。?br />經過上面的分析我們還可以知道,不能讓cshtml中DropDownList的第一個name參數和ViewBag中任何一個屬性重名,否則還是會有問題,比如

public ActionResult Index(){List<SelectListItem> persons = new List<SelectListItem>(); persons.Add(new SelectListItem { Text = "騰訊", Value = "qq" });persons.Add(new SelectListItem { Text = "如鵬", Value = "rupeng", Selected = true });ViewBag.persons = persons;ViewBag.persons1 = new string[] { };return View();}

  

Cshtml如下:
@Html.DropDownList("persons1", (IEnumerable<SelectListItem>)ViewBag.persons)

生成的html中第二條數據照樣不會被selected

不知道微軟為什么把DropDownList這么簡單的一個東西搞的這么復雜,正驗證了這句話“寫的越多,錯的越多”。當然也許微軟會給出理由說我們用錯了,說“It’s not a bug,It’s a feature,by design”好吧!謝特!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品久久久久久久| 日韩av电影手机在线观看| 成人网页在线免费观看| 亚洲精品美女久久久久| 亚洲午夜精品久久久久久久久久久久| 久久久久久国产精品| 欧美精品videosex极品1| 色噜噜狠狠色综合网图区| 久久亚洲精品网站| 亚洲精品wwwww| 人体精品一二三区| 欧美性xxxxhd| 欧美裸体男粗大视频在线观看| 青青精品视频播放| 国产美女精品视频免费观看| 日韩欧美在线视频日韩欧美在线视频| 成人av色在线观看| 午夜精品久久久久久99热软件| 亚洲国产小视频在线观看| 亚洲性生活视频| 色婷婷亚洲mv天堂mv在影片| 成人精品一区二区三区电影免费| 欧美美女18p| 欧美大荫蒂xxx| 国产精品人人做人人爽| 国产午夜精品一区二区三区| 国外日韩电影在线观看| 日韩在线观看免费高清| 久久天堂av综合合色| 欧美亚洲国产精品| 91美女高潮出水| 亚洲加勒比久久88色综合| 亚洲综合社区网| 91视频免费网站| 国产欧美va欧美va香蕉在线| 国产精品久久av| 激情亚洲一区二区三区四区| 欧美大肥婆大肥bbbbb| 疯狂做受xxxx高潮欧美日本| 成人黄色在线免费| 亚洲国产日韩一区| 最近2019中文免费高清视频观看www99| 欧美中文字幕在线播放| 最近中文字幕2019免费| 国产精品观看在线亚洲人成网| 国产精品免费久久久久影院| 国产综合在线视频| 国产精品日韩精品| 久久久精品免费| 国产精品激情av电影在线观看| 亚洲第一网站免费视频| 日本a级片电影一区二区| 成人福利在线观看| 国产精品小说在线| 国产精品永久免费视频| 98精品在线视频| 影音先锋欧美精品| 国产精品视频免费在线观看| 狠狠躁天天躁日日躁欧美| 国产精品久久久久久久美男| 97高清免费视频| 国产精品美女999| 国产中文日韩欧美| 91国内免费在线视频| 青青久久av北条麻妃海外网| 91在线观看免费网站| 日韩av在线精品| 国产福利精品视频| 日韩电影在线观看永久视频免费网站| 一本大道久久加勒比香蕉| 久久精品一偷一偷国产| 精品久久久国产精品999| 欧美激情一区二区三区久久久| 国产欧美精品在线| 91精品久久久久久久久久久久久久| 亚洲国产精品久久久久久| 亚洲精品自拍偷拍| 成人深夜直播免费观看| 亚洲2020天天堂在线观看| 亚洲aa在线观看| 国产精品免费在线免费| 亚洲娇小xxxx欧美娇小| 中文字幕成人精品久久不卡| 欧美性视频网站| 久久久久久久久久久久av| 国产精品免费一区二区三区都可以| 欧美日韩在线看| 亚洲一区二区在线| 国产一区私人高清影院| 国产香蕉精品视频一区二区三区| 亚洲精品免费网站| 51精品国产黑色丝袜高跟鞋| 色天天综合狠狠色| 亚洲欧美变态国产另类| 啪一啪鲁一鲁2019在线视频| 亚洲大胆美女视频| 日韩高清av在线| 欧美国产日本高清在线| 精品国产乱码久久久久久天美| 岛国av在线不卡| 欧美激情第6页| 992tv在线成人免费观看| 日韩免费在线观看视频| 国产69精品久久久久久| 欧美精品久久久久久久久久| 日韩中文综合网| 8x海外华人永久免费日韩内陆视频| 深夜福利一区二区| 日韩精品免费在线视频观看| 深夜福利91大全| 91网站在线免费观看| 国产精品私拍pans大尺度在线| 一区三区二区视频| 久久青草福利网站| 美女精品视频一区| 精品国内亚洲在观看18黄| 久久久久久久久久久成人| 国产日韩欧美中文| 国产精品久久久久7777婷婷| 国内精品国产三级国产在线专| 欧洲亚洲女同hd| 欧美黑人极品猛少妇色xxxxx| 久久综合国产精品台湾中文娱乐网| 欧美日韩一区二区在线播放| 欧美日韩国产91| 国产精品中文字幕久久久| 日韩电影网在线| 亚洲天堂av电影| 91精品国产91久久久久久最新| 综合欧美国产视频二区| 成人a级免费视频| 国产日韩精品在线播放| 日韩中文有码在线视频| 欧美在线激情视频| 日韩欧美国产中文字幕| 日韩美女主播视频| 欧美xxxx综合视频| 亚洲性线免费观看视频成熟| 欧美另类精品xxxx孕妇| 欧美黑人巨大精品一区二区| 国产精品青青在线观看爽香蕉| 欧美与欧洲交xxxx免费观看| 欧美最猛性xxxxx亚洲精品| 国产a级全部精品| 国产主播欧美精品| 久久在精品线影院精品国产| 久久久久国产精品一区| 成人福利免费观看| 欧美疯狂做受xxxx高潮| 国产精品黄页免费高清在线观看| 91日本视频在线| 日韩少妇与小伙激情| 亚洲r级在线观看| 永久免费看mv网站入口亚洲| 高清欧美性猛交| 国产综合在线视频| 97av在线播放| 日韩国产精品亚洲а∨天堂免| 午夜精品久久17c| 中文字幕精品av| 精品国产乱码久久久久久虫虫漫画| 亚洲影院在线看| 国产视频欧美视频| 欧美精品福利视频|