下拉不在ToSelectList扩展方法中工作

时间:2012-10-08 10:17:08

标签: asp.net-mvc-3

我有一个可以为空的枚举,与同一页面上的其他枚举不同,它不起作用。我有一个枚举Title,使用扩展方法将有助于填充页面上的下拉列表。以下是ViewBag声明的样子:

ViewBag.TitleList = EnumExtensions.ToSelectList<Title>("[select]");

现在,也许有人可以向我解释,但这就是在MVC中绑定时发生黑魔法的地方。如果在调用if(ModelState.IsValid)时页面无效,则在重新呈现屏幕时,将再次调用上述语句。但是这一次,将选择正确的下拉项目(取决于您当时选择的项目)。

深入挖掘,这是方法声明:

    public static SelectList ToSelectList<TEnum>(string nullEntry = null) where TEnum : struct
    {
        return ToSelectList<TEnum>(nullEntry, null);
    }


    public static SelectList ToSelectList<TEnum>(string nullEntry = null, string selectedValue = null) where TEnum : struct
    {
        var enumType = typeof(TEnum);
        var values = Enum.GetValues(enumType).OfType<TEnum>();
        List<SelectListItem> items =  ToSelectList<TEnum>(values, nullEntry, selectedValue);
        SelectList sl = new SelectList(items, "Value", "Text", selectedValue);
        return sl;
    }

    public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, string nullEntry, string selectedValue = null)
    {
        List<SelectListItem> items;

        if ((typeof(T).IsEnum))
        {
            items = enumerable.Select(f => new SelectListItem()
            {
                Text = f.GetDescription(),
                Value = f.ToString(),
                Selected = f.ToString() == selectedValue
            }).ToList();
        }
        else
        {
            items = enumerable.Select(f => new SelectListItem()
            {
                Text = f.ToString(),
                Value = f.ToString()
            }).ToList();
        }

        if (!string.IsNullOrEmpty(nullEntry))
        {
            items.Insert(0, new SelectListItem() { Text = nullEntry, Value = "" });
        }

        return items;
    }

处理随机案件只有一些重载,但可能不需要其中一些。

正如我所说,将为其他枚举选择正确的项目,但对于这个特定的项目,它不会。这是枚举声明:

public enum Title
{
    Mr,
    Miss,
    Mrs,
    Ms
}

最后,在页面上使用DropDownListFor的声明;

@Html.DropDownListFor(x => x.Title, (SelectList)ViewBag.TitleList)

问题在于,当我第一次访问该页面时,所选项目始终为“[select]”(当模型中提供的枚举值为null时)。但是,模型属性Title 肯定具有值集,并且也为下拉列表设置了SelectedItem属性,但在屏幕上,它默认为“[选择]“这是意料之外的。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

是不是因为名字Title?尝试将其更改为其他名称,以便查看。

答案 1 :(得分:0)

也许您应该尝试添加String.Empty,以便下拉列表默认为空白

  

@ Html.DropDownListFor(x =&gt; x.Title,(SelectList)ViewBag.TitleList,String.Empty)