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

我快要疯了。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?这明显不符合常理,指望之后找到答案,或者有谁能告诉我一下。

相关文章
相关标签/搜索