Html.DropDownListFor的选项值为字符型问题

来源:互联网 发布:php命名空间找不到类 编辑:程序博客网 时间:2024/06/05 08:19

我快要疯了。asp.net mvc的这个DropDownListFor,无论在服务器端如何设置,设置哪个值被选中,结果到了页面输出,选中值根本没有被选中,没有任何一个值被选中,下拉框只冷冰冰地显示一个“–请选择–”。

强调一下,如果对于 value 是数值型,而text是字符型来说,不存在以上问题;但如果value 和 text ,都是字符型,问题就像开头描述的那样。

我靠,太玄乎了吧。

花了好长时间,累到差点虚脱,我都怀疑自己是不是太老,不再适合搞开发了。连这种简单的问题都搞不定,说不过去啊。

后来发现:
1、服务器端设置哪个值被选中,或者默认值是啥,对于 DropDownListFor 不起作用,它会根据绑定的属性自动匹配;对 DropDownList 有作用;
比如:

    public enum EYJStatus    {        [EnumTitle("解除")]        解除,        [EnumTitle("蓝色")]        蓝色,        [EnumTitle("黄色")]        黄色,        [EnumTitle("橙色")]        橙色,        [EnumTitle("红色")]        红色    }无论是在服务器端指定默认值var yjStatus = new SelectList(EnumHelper.GetItemKeyList<EYJStatus>().Select(s => s.ToString()).ToList(),"蓝色");还是不指定var yjStatus = new SelectList(EnumHelper.GetItemKeyList<EYJStatus>().Select(s => s.ToString()).ToList());然后ViewData.Add("STATE", yjStatus);在前端,都没有影响:@Html.DropDownListFor(m => m.STATE, null, "--请选择--", new { })

2、对于DropDownListFor,其参数 IEnumerable selectList,似乎只能设置成null,然后由系统自动对应到ViewData[“属性名”],通过这种方式才能起作用。比如:

var yjStatus = new SelectList(EnumHelper.GetItemKeyList<EYJStatus>().Select(s => s.ToString()).ToList());ViewData.Add("STATE", yjStatus);//有效,且能解决本文所说的问题@Html.DropDownListFor(m => m.STATE, null, "--请选择--", new { })//无效@Html.DropDownListFor(m => m.STATE, ViewData["STATE"] as IEnumerable<SelectListItem>, "--请选择--", new { })

3、DropDownListFor 会设置 IEnumerable selectList 的值
比如:

//服务器端var yjStatus = EnumHelper.GetItemKeyList<EYJStatus>().Select(s => new SelectListItem(){    Text = s.ToString(),    Value = s.ToString(),    Selected = (s.ToString() == "蓝色") ? true : false}).ToList();ViewData.Add("STATE", yjStatus);//前端@Html.DropDownListFor(m => m.STATE, null, "--请选择--", new { })@Html.DropDownList("STATE2", ViewData["STATE"] as IEnumerable<SelectListItem>, "--请选择--", new { })

结果第二个下拉框的默认值不再是“蓝色”,有可能是其他值;假如将两个下拉框调换一下位置:

@Html.DropDownList("STATE2", ViewData["STATE"] as IEnumerable<SelectListItem>, "--请选择--", new { })@Html.DropDownListFor(m => m.STATE, null, "--请选择--", new { })

则处于前面的下拉框永远显示“蓝色”。

如果能读一下asp.net mvc的相关源代码,应该可以明了个中原因吧。不过,要读懂并非易事,即使读懂,也改变了什么。

把时间花在这种应用型的处理办法上,真窝囊。但又不能不处理。再有,参数 IEnumerable selectList 一定要设置成null?这明显不符合常理,期望以后找到答案,或者有谁能告诉我一下。

0 0
原创粉丝点击