加载Mvc Html.DropDownList替换一些字符串

时间:2017-05-02 10:53:52

标签: asp.net-mvc asp.net-mvc-5

我有这个由我的枚举

生成的下拉列表
@Html.DropDownList("MyType",
EnumHelper.GetSelectList(typeof(C_Survey.Models.QuestionType)),
"Select My Type",
new { @class = "form-control N_Q_type" })

枚举:

public enum QuestionType {
    Single_Choice,
    Multiple_Choice,
    Range
}

我的问题是,如何用空格替换_

1 个答案:

答案 0 :(得分:2)

我不知道GetSelectList方法的详细信息,但我认为它会收到System.Enum并返回SelectList这样的集合:

public static SelectList GetSelectList(this Enum enumeration)
{
    var source = Enum.GetValues(enumeration);
    // other stuff
    ...

    return new SelectList(...);
}

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

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

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

public class DisplayNameAttribute : Attribute
{
    public string DisplayName { get; protected set; }
    public DisplayNameAttribute(string value)
    {
        this.DisplayName = value;
    }

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

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

public enum QuestionType 
{
    [DisplayName("Single Choice")]
    Single_Choice,

    [DisplayName("Multiple Choice")]
    Multiple_Choice,

    [DisplayName("By Range")]
    Range
}

稍后,有必要修改GetSelectList方法以接受上面创建的包含DisplayName属性的自定义属性:

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");
}

第二种方法(使用Direct Type Cast&amp; Lambda)

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

T

您方面的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); } 方法内容可能略有不同,但基本知识应与这些方法相同。

类似问题:

How do I populate a dropdownlist with enum values?

Display enum in ComboBox with spaces

enum with space property for dropdownlist