关于asp.net mvc:加载Mvc Html.DropDownList替换一些字符串

Mvc Html.DropDownList on load replace some string

我有一个由枚举生成的下拉列表

1
2
3
4
@Html.DropDownList("MyType",
EnumHelper.GetSelectList(typeof(C_Survey.Models.QuestionType)),
"Select My Type",
new { @class ="form-control N_Q_type" })

枚举:

1
2
3
4
5
public enum QuestionType {
    Single_Choice,
    Multiple_Choice,
    Range
}

我的问题是,我怎样才能用一个空格替换_


我对那里的GetSelectList方法不太了解,但我假设它收到了System.Enum并返回了这样的SelectList集合:

1
2
3
4
5
6
7
8
public static SelectList GetSelectList(this Enum enumeration)
{
    var source = Enum.GetValues(enumeration);
    // other stuff
    ...

    return new SelectList(...);
}

解决这个问题有两种方法:

第一种方法(使用自定义属性)

此方法涉及创建自定义属性以定义显示名称(将属性目标设置为字段或其他适合整个枚举成员的属性):

1
2
3
4
5
6
7
8
9
10
11
12
13
public class DisplayNameAttribute : Attribute
{
    public string DisplayName { get; protected set; }
    public DisplayNameAttribute(string value)
    {
        this.DisplayName = value;
    }

    public string GetName()
    {
        return this.DisplayName;
    }
}

因此,枚举结构应该修改为:

1
2
3
4
5
6
7
8
9
10
11
public enum QuestionType
{
    [DisplayName("Single Choice")]
    Single_Choice,

    [DisplayName("Multiple Choice")]
    Multiple_Choice,

    [DisplayName("By Range")]
    Range
}

以后需要修改GetSelectList方法,接受上面创建的自定义属性,其中包括DisplayName属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static SelectList GetSelectList<T>(this T enumeration)
{
    var source = Enum.GetValues(typeof(T));

    var items = new Dictionary<Object, String>();
    var displaytype = typeof(DisplayNameAttribute);

    foreach (var value in source)
    {
        System.Reflection.FieldInfo field = value.GetType().GetField(value.ToString());
        DisplayNameAttribute attr = (DisplayNameAttribute)field.GetCustomAttributes(displaytype, false).FirstOrDefault();

        items.Add(value, attr != null ? attr.GetName() : value.ToString());
    }

    return new SelectList(items,"Key","Value");
}

第二种方法(使用直接类型转换和lambda)

与第一种方法类似,GetSelectList方法将从enum返回SelectList,但该方法不使用自定义属性,而是使用成员名构建如下所示的选择列表项(T是枚举类型参数):

1
2
3
4
5
6
7
8
9
public static SelectList GetSelectList<T>(this T enumeration)
{
    var source = Enum.GetValues(typeof(T)).Cast<T>().Select(x => new SelectListItem() {
        Text = x.ToString(),
        Value = x.ToString().Replace("_","")
    });

    return new SelectList(source);
}

可能您这边的GetSelectList方法内容稍有不同,但基本内容应该与这些方法相同。

类似问题:

如何用枚举值填充DropDownList?

在带有空格的组合框中显示枚举

DropDownList的带有空格属性的枚举