c# - DropdownListFor 所选值未在呈现的 html 中选择

标签 c# asp.net-mvc asp.net-mvc-3

我有一个扩展方法,我正在尝试使用它,您可以在其中使用枚举属性创建下拉列表,并设置所选项目:

public enum DefaultEnumSelectItemOptions
{
    AddDefaultItemIfEnumIsZero,
    ZeroEnumIsDefaultItem
}
public static SelectList ToSelectList(this object enumObj, DefaultEnumSelectItemOptions option = DefaultEnumSelectItemOptions.AddDefaultItemIfEnumIsZero)
{
    var asEnum = Enum.Parse(enumObj.GetType(), enumObj.ToString());
    var values = Enum.GetValues(enumObj.GetType());
    var dataItems = new List<Tuple<string, int>>();
    dataItems.Add(new Tuple<string, int>("Select One", -1));
    for (int i = 0; i < values.Length; i++)
    {
        int enumValue = (int)values.GetValue(i);
        if (enumValue == 0)
        {
            if (option != DefaultEnumSelectItemOptions.AddDefaultItemIfEnumIsZero)
            {
                dataItems.Add(new Tuple<string, int>(values.GetValue(i).ToString(), enumValue));
            }
        }
        else
        {
            dataItems.Add(new Tuple<string, int>(values.GetValue(i).ToString(), enumValue));
        }
    }
    var selectedItemValue = (int)enumObj;
    if (selectedItemValue == 0 && option == DefaultEnumSelectItemOptions.AddDefaultItemIfEnumIsZero)
    {
        selectedItemValue = -1;
    }
    return new SelectList(dataItems, "Item2", "Item1", selectedItemValue);
}

一个模型看起来像这样:

public enum PropertyTypes
{
    Unknown=0,
    Vehicle,
    Other
}

[DataContract]
public class Property : ClaimEntity
{
    [DataMember]
    public PropertyTypes PropertyType { get; set; }

    public Property()
    {
        this.PropertyType = PropertyTypes.Vehicle;
    }
}

最后的 View 是这样的:

@Html.DropDownListFor(m => m.PropertyType, Model.PropertyType.ToSelectList())

当我在扩展方法中设置断点时,它似乎是正确的,但所选的选项没有出现在 html 中。

dropdown issue

我做错了什么?

编辑 我按照建议将其更改为使用 SelectListItem,但是我仍然没有看到选择的值:

enter image description here

最佳答案

我自己实际上遇到了这个确切的问题,并发现 DropDownListFor(和 DropDownList)帮助器对于它们自己的好处来说有点太聪明了。

即使您传入了一组SelectListItem,其中一个Selected = true,帮助程序实际上会评估您的模型,做a Convert.ToString() ,并尝试匹配该值。如果找不到该值,它将不选择任何内容。

我个人认为这是 MVC 中的一个重大错误,他们似乎没有在 MVC4 中纠正这一错误。他们认为对象的 ToString() 方法会匹配下拉列表中的值(而不是显示文本),这完全是虚假的假设。

编辑:至于解决这个问题的方法......

  1. 更改您的 ToString() 方法以返回值并找到一种不同的方式来获取显示文本。
  2. 由于您使用的是枚举,因此您可以只为您的值和显示文本使用字符串版本。它仍然可以很好地绑定(bind)。
  3. 建立自己的下拉菜单

关于c# - DropdownListFor 所选值未在呈现的 html 中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10655220/

相关文章:

c# - 如何使用 LINQ 从 List<int> 中获取最接近的数字?

mysql - 如何在 Visual Web Developer 2010 Express 中从数据库更新模型?

asp.net-mvc-3 - mvc3/razor String.Format ("{0:c}", totalprice) 不返回小数点或后面的数字

c# - ASP.NET MVC3 和 Facebook 集成

c# - Asp.Net MVC 处理不属于模型的下拉框

c# - 所有数学运算都以整数形式返回?

c# - Convert.ToInt32(String) on String.Empty 与 Null

c# - 我如何使用方法而不是硬编码(使用 Entity Framework )向实体添加属性?

asp.net-mvc - 在 ASP.NET MVC 测试项目中模拟静态方法

asp.net - 是否可以并行运行 iis6 和 iis7?