Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在使用枚举值填充的DropDownList中选择多个值?_Asp.net Mvc_Asp.net Mvc 3_Enums_Multi Select_Html.dropdownlistfor - Fatal编程技术网

Asp.net mvc 如何在使用枚举值填充的DropDownList中选择多个值?

Asp.net mvc 如何在使用枚举值填充的DropDownList中选择多个值?,asp.net-mvc,asp.net-mvc-3,enums,multi-select,html.dropdownlistfor,Asp.net Mvc,Asp.net Mvc 3,Enums,Multi Select,Html.dropdownlistfor,我正在使用ASP.NET MVC3,我想用枚举值填充DropDownList,并选择一个或多个选项 我定制了DropDownList,以使它看起来像一个“CheckedDropDownList”,并且,在一个非常基本的编辑表单中,我需要检查实际值 以下是如何构造我的枚举: public enum MyEnum { [Display(Name = "Undefined")] UNDEFINED = -1, //I really need this "detail" [Di

我正在使用ASP.NET MVC3,我想用枚举值填充DropDownList,并选择一个或多个选项

我定制了DropDownList,以使它看起来像一个“CheckedDropDownList”,并且,在一个非常基本的
编辑
表单中,我需要检查实际值

以下是如何构造我的枚举:

public enum MyEnum
{
    [Display(Name = "Undefined")]
    UNDEFINED = -1, //I really need this "detail"

    [Display(Name = "First Value")]
    VALUE1,

    [Display(Name = "Second Value")]
    VALUE2

    [Display(Name = "Other")]
    OTHER,
}
我还使用了这个
ToLocalizedSelectList()
方法,我试图从中进行调整,但无法修改它以接受多个选定值

public static SelectList ToLocalizedSelectList<T>(this T enumeration, string selected)
{
    var source = Enum.GetValues(typeof(T)).Cast<T>().OrderBy(x => x); //I always need UNDEFINED as first element
    var items = new Dictionary<object, string>();
    var displayAttributeType = typeof(DisplayAttribute);

    foreach (var value in source)
    {
        FieldInfo field = value.GetType().GetField(value.ToString());
        DisplayAttribute attrs = (DisplayAttribute)field.GetCustomAttributes(displayAttributeType, false).FirstOrDefault();
        items.Add(value, attrs != null ? attrs.GetName() : value.ToString());
    }

    return new SelectList(items, "Key", "Value", selected);
}
问题是,我认为,在第三个参数上,我需要传递
Model.EnumValues
,而不是
Model.EnumValues.First()
,它总是只预选MyEnum枚举的第一项

第二个参数也可能是个问题,因为
ToLocalizedSelectList()
需要一个this MyEnum枚举作为第一个参数,所以我将它作为枚举的第一项传递给它,但我不确定这是一个好的解决方案

如何将此
转换为LocalizedSelectList()
方法以使其接受多个选定值,以及如何在
@Html.DropDownListFor
(或
@Html.ListBoxFor
)中使用它

非常感谢


仅供参考,我还尝试了以下代码:

@Html.ListBoxFor(m => m.EnumValues, 
                  new SelectList(Enum.GetValues(typeof(MyEnum))
                     .Cast<MyEnum>()
                     .OrderBy(e => (int)e)
                  ), new { @id = "ddlMyEnum" }
                 )
@Html.ListBoxFor(m=>m.EnumValues,
新建SelectList(Enum.GetValues(typeof(MyEnum))
.Cast()
.OrderBy(e=>(int)e)
),新的{@id=“ddlmeyenum”}
)

并且它预先选择好的,但是,它显示枚举名称,如
未定义
值1
,而不是它们的
显示名称
属性(
未定义
第一个值
)等等。

注意:这只解决了部分代码问题-显示“友好”枚举描述

创建用于获取友好描述的扩展方法。注意:这使用的是
[Description]
属性,而不是
[Display]
属性

public static string ToDescription(this Enum value)
{
  FieldInfo field = value.GetType().GetField(value.ToString());
  DescriptionAttribute[] attributes = (DescriptionAttribute[])field
    .GetCustomAttributes(typeof(DescriptionAttribute), false);
  if (attributes.Length > 0)
  {
    return attributes[0].Description;
  }
  return value.ToString();
}
它可以与

public enum ProjectStatus
{
  Draft,
  [Description("In limbo")]
  OnHold,
  Completed
}
然后创建一个扩展方法来创建一个选择列表

public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
  where TEnum : struct, IComparable, IFormattable, IConvertible
{
  var values = from TEnum e in Enum.GetValues(typeof(TEnum))
    select new { ID = e, Name = e.ToDescription() }; // or ID = (int)e, depending on what you want the as the value
  return new SelectList(values, "ID", "Name", enumObj);
}

至于其余的部分,我不理解您的方法,也不理解创建枚举值数组会有什么好处,也不理解结果如何存储在数据库中。我的方法是在视图模型中创建布尔属性,然后让用户检查他们想要的选项。

我今天刚刚用以下方法纠正了这个老错误:

@Html.ListBoxFor(m => m.EnumValues, 
                 Model.EnumValues.ToLocalizedSelectList<MyEnum>(Model.EnumValues.ToList())
                )
@Html.ListBoxFor(m=>m.EnumValues,
Model.EnumValues.ToLocalizedSelectList(Model.EnumValues.ToList())
)
其中
ToLocalizedSelectList()
与上面发布的相同,但签名除外:

public static SelectList ToLocalizedSelectList<T>(this T[] enumeration, List<T> selected)
publicstaticselectlist到localizedselectlist(此T[]枚举,选择列表)

希望它对某人有所帮助

是否有理由不去寻找已经存在的东西,例如??我没有在你链接的插件中看到如何像我一样将一个简单的DropDownList转换为一个在每个选项前面带有复选框的CheckedDropDownList,所以我认为这是一个不使用它的好理由。为了诚实起见,我使用jquerymultiselect插件来做到这一点:。99%的工作都完成了,我只想回答下面的问题,以得到缺少的1%并解决这个问题。足够公平,我很好奇。我在这里看到很多问题。首先,如果要选择多个值,则需要
@Html.ListBoxFor()
,而不是
@HtmlDropDownListFor()
ToLocalizedSelectList()
的第一个参数是类型enum,但您需要传递一个enum值。第二个参数似乎毫无意义,因为
@Html.ListBoxFor()
方法将根据yot属性
EnumValues
中的值将值标记为选中。然后是使用枚举的逻辑。也许您应该使用
[Flags]
属性,以便将枚举值(标志)的集合分配给属性,而不是枚举数组values@StephenMuecke,我尝试将第一个参数更改为
typeof(MyEnum)
,或
MyEnum
,但没有成功。你能提供一个代码示例吗?我不熟悉
[Flags]
属性,我来看看。您的代码正常工作,所以我向上投票;但是,正如您自己所说,它并没有真正解决问题,因为我已经知道如何在DropDownList for中显示
[display]
属性(请参阅我第一篇文章的最后一部分)。我真正需要的是如何预先选择多个元素,这些元素在
listbox的
Display
属性中显示,以表示感谢(不希望出现勾号)。这可能有用。如果
EnumValues
int[]
并且它的值被设置为
[1,3]
,那么
SelectList
将选项值创建为
int
(在我的扩展方法中,它将是
选择新的{ID=(int)e,Name=e.ToDescription()}
,那么
@Html.ListBoxFor(m=>m.EnumValues,Model.X)
(可能)选择第二个和第四个值。注意
Model.X
是视图Model
public MyEnum Something{get;set;}
中的一个属性,默认为
UNDEFINED
,以便您可以生成具有友好名称的选择列表,并在
EnumValues
为空时提供默认选择
@Html.DropDownListFor(m => m.Status, Model.Status.ToSelectList())
@Html.ListBoxFor(m => m.EnumValues, 
                 Model.EnumValues.ToLocalizedSelectList<MyEnum>(Model.EnumValues.ToList())
                )
public static SelectList ToLocalizedSelectList<T>(this T[] enumeration, List<T> selected)