我快要疯了。asp.net mvc的这个DropDownListFor,不管在服务器端如何设置,设置哪一个值被选中,结果到了页面输出,选中值根本没有被选中,没有任何一个值被选中,下拉框只冷冰冰地显示一个“–请选择–”。php
强调一下,若是对于 value 是数值型,而text是字符型来讲,不存在以上问题;但若是value 和 text ,都是字符型,问题就像开头描述的那样。前端
我靠,太玄乎了吧。服务器
花了好长时间,累到差点虚脱,我都怀疑本身是否是太老,再也不适合搞开发了。连这种简单的问题都搞不定,说不过去啊。markdown
后来发现:
一、服务器端设置哪一个值被选中,或者默认值是啥,对于 DropDownListFor 不起做用,它会根据绑定的属性自动匹配;对 DropDownList 有做用;
好比:mvc
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 { })
二、对于DropDownListFor,其参数 IEnumerable selectList,彷佛只能设置成null,而后由系统自动对应到ViewData[“属性名”],经过这种方式才能起做用。好比:asp.net
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 { })
三、DropDownListFor 会设置 IEnumerable selectList 的值
好比:spa
//服务器端
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 { })
结果第二个下拉框的默认值再也不是“蓝色”,有多是其余值;假如将两个下拉框调换一下位置:.net
@Html.DropDownList("STATE2", ViewData["STATE"] as IEnumerable<SelectListItem>, "--请选择--", new { })
@Html.DropDownListFor(m => m.STATE, null, "--请选择--", new { })
则处于前面的下拉框永远显示“蓝色”。code
若是能读一下asp.net mvc的相关源代码,应该能够明了个中缘由吧。不过,要读懂并不是易事,即便读懂,也改变了什么。coffeescript
把时间花在这种应用型的处理办法上,真窝囊。但又不能不处理。再有,参数 IEnumerable selectList 必定要设置成null?这明显不符合常理,指望之后找到答案,或者有谁能告诉我一下。