代码之家  ›  专栏  ›  技术社区  ›  AlexCuse

ASP.net MVC中枚举下拉列表中的选定项

  •  13
  • AlexCuse  · 技术社区  · 14 年前

    抱歉,如果这是一个重复,我的搜索没有找到任何东西。

    http://addinit.com/?q=node/54 ):

    public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected)
    {
        if (!type.IsEnum)
            throw new ArgumentException("Type is not an enum.");
    
        if(selected != null && selected.GetType() != type)
            throw new ArgumentException("Selected object is not " + type.ToString());
    
        var enums = new List<SelectListItem>();
        foreach (int value in Enum.GetValues(type))
        {
            var item = new SelectListItem();
            item.Value = value.ToString();
            item.Text = Enum.GetName(type, value);
    
            if(selected != null)
                item.Selected = (int)selected == value;
    
            enums.Add(item);
         }
    
        return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, enums, "--Select--");
    }
    

    它工作得很好,除了一件事。如果我给下拉列表的名称与我的模型上的属性相同,则所选的值设置不正确。这意味着:

    <%= Html.DropDownList("fam", typeof(EnumFamily), Model.Family)%>
    

    但事实并非如此:

    <%= Html.DropDownList("family", typeof(EnumFamily), Model.Family)%>
    

    因为我试图将整个对象直接传递给我发布到的控制器方法,所以我会 真正地 我想让下拉列表为模型上的属性命名。当使用“right”名称时,下拉列表确实正确,我似乎无法设置所选的值。

    编辑: 我刚刚在windows上测试了这个,我看到了同样的行为

    3 回复  |  直到 14 年前
        1
  •  14
  •   eglasius    14 年前

    请尝试不将int值用于enum/而不是:

    item.Value = value.ToString();

    item.Value = Enum.GetName(type, value);

        2
  •  4
  •   Community kfsone    7 年前

    实际上,这就是解决办法。在这个问题上的解决办法和我的一样。
    ASP.NET MVC - Html.DropDownList - Value not set via ViewData.Model

        public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected)
        {
            if (!type.IsEnum)
                throw new ArgumentException("Type is not an enum.");
    
            if (selected != null && selected.GetType() != type)
                throw new ArgumentException("Selected object is not " + type.ToString());
    
            var enums = new List<SelectListItem>();
            foreach (int value in Enum.GetValues(type))
            {
                var item = new SelectListItem();
                item.Value = value.ToString();
                item.Text = Enum.GetName(type, value);
    
                if (selected != null)
                    item.Selected = (int)selected == value;
    
                enums.Add(item);
            }
    
            // set ViewData first
            helper.ViewData[name] = enums;
    
            // pass in "null" intentionally into the DropDownList extension method
            return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, null, "--Select--");
        }
    

    使用 item.Value = Enum.GetName(type, value); 使下拉列表<选项>要呈现为枚举名称的值。 我个人更喜欢 int 值作为回发。

    希望有帮助。

        3
  •  0
  •   AlexCuse    14 年前

    这看起来不太正确,但我发现如果我用{nameOfInputParameter}.{propertyName}命名下拉列表,它将正确加载和发布。因此,如果所讨论的表单正在发布到一个方法,该方法采用与表单模型“myModel”相同类型的参数,那么family的下拉列表可以如下设置:

    <%= Html.DropDownList("myModel.family", typeof(EnumFamily), Model.Family)%>
    

    这将以myModel\u family的id和myModel.family的名称呈现。我不知道该怎么想,我觉得有点不对劲。但到目前为止,它似乎确实奏效了。不过,这确实带来了一个新问题。您不能再初始化文本框等。。。像这样:

    <%= Html.TextBox("name") %>
    

    但是,至少使用默认的model活页夹,下面的内容并不能解析为一个值(我想知道在这里进行挖掘是否能得到这个问题的最佳答案):

    <%= Html.TextBox("myModel.name") %>
    

    所以你需要这样做:

    <%= Html.TextBox("myModel.name", Model.Name) %>
    

    这一切都变得非常恶心(尤其是在我需要能够处理模型为空的情况的页面上)。希望其他人有更好的主意:)