首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单选按钮列表枚举的MVC 3帮助器

单选按钮列表枚举的MVC 3帮助器
EN

Stack Overflow用户
提问于 2012-07-16 22:35:20
回答 2查看 2.8K关注 0票数 3

我需要些帮助。我正在尝试构建一个视图,其中我需要一组枚举类型的单选按钮。我有几个类似的枚举类型(类):

代码语言:javascript
运行
复制
[DataContract(Namespace = Constants.SomeDataContractNamespace)]
public enum OneEnumDataContract
{
    [Display(Name = "Text_None", Description = "Text_None", ResourceType = typeof(TextResource))]
    [EnumMember]
    None = 0,

    [Display(Name = "Text_Medium", Description = "Text_Medium", ResourceType = typeof(TextResource))]
    [EnumMember]
    Medium = 1,

    [Display(Name = "Text_Very", Description = "Text_Very", ResourceType = typeof(TextResource))]
    [EnumMember]
    Very = 2
}

在我的模型(使用WCF的数据契约)中,我对枚举数据契约有以下属性:

代码语言:javascript
运行
复制
    [DataMember(Order = 23)]
    [Display(Name = "EnumValue", Description = "EnumValue_Description", ResourceType = typeof(TextResource))]
    public OneEnumDataContract EnumClass1 { get; set; }

在我看来,我会试着让这组单选按钮像这样(用一个助手):

代码语言:javascript
运行
复制
@Html.RadioButtonListEnum("EnumList1", Model.EnumClass1)

我的助手:

代码语言:javascript
运行
复制
public static MvcHtmlString RadioButtonListEnum<TModel>(this HtmlHelper<TModel> helper, string  NameOfList, object RadioOptions)
    {
        StringBuilder sb = new StringBuilder();
        //som other code for pairing with resourcefile...

        foreach(var myOption in enumTexts.AllKeys)
        {
            sb.Append("<p>");
            sb.Append(enumTexts.GetValues(myOption)[0]);
            sb.Append(helper.RadioButton(NameOfList, System.Convert.ToInt16(myOption)));
            sb.Append("</p>");
        }
        return MvcHtmlString.Create(sb.ToString());
    }

这为我提供了OneEnumDataContract中的第一个枚举值None,作为参数RadioOptions。如何将数据契约中的所有枚举值都放到帮助器中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 02:56:24

这是我最近创建的一个。如果您在非枚举上尝试它,它将不起作用,但可以满足我的枚举需求。我从不同的DropDownList助手中复制了一些比特和片段,比如nikeaa posted。

代码语言:javascript
运行
复制
#region RadioButtonList


public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes = null) where TModel : class
{
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    String field = ExpressionHelper.GetExpressionText(expression);
    String fieldname = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(field);
    var inputName = fieldname;
    TProperty val = GetValue(htmlHelper, expression);

    var divTag = new TagBuilder("div");
    divTag.MergeAttribute("id", inputName);
    divTag.MergeAttribute("class", "radio");
    foreach (var item in Enum.GetValues(val.GetType()))
    {


        DisplayAttribute[] attr = (DisplayAttribute[])item.GetType().GetField(item.ToString()).GetCustomAttributes(typeof(DisplayAttribute), true);
        if (attr == null || attr.Length == 0 || attr[0].Name != null)
        {
            string name = attr != null && attr.Length > 0 && !string.IsNullOrWhiteSpace(attr[0].Name) ? attr[0].Name : item.ToString();
            var itemval = item;
            var radioButtonTag = RadioButton(htmlHelper, inputName, new SelectListItem { Text = name, Value = itemval.ToString(), Selected = val.Equals(itemval) }, htmlAttributes);

            divTag.InnerHtml += radioButtonTag;
        }
    }


    return new MvcHtmlString(divTag.ToString());
}




public static string RadioButton(this HtmlHelper htmlHelper, string name, SelectListItem listItem,
                     IDictionary<string, object> htmlAttributes)
{
    var inputIdSb = new StringBuilder();
    inputIdSb.Append(name)
        .Append("_")
        .Append(listItem.Value);

    var sb = new StringBuilder();

    var builder = new TagBuilder("input");
    if (listItem.Selected) builder.MergeAttribute("checked", "checked");
    builder.MergeAttribute("type", "radio");
    builder.MergeAttribute("value", listItem.Value);
    builder.MergeAttribute("id", inputIdSb.ToString());
    builder.MergeAttribute("name", name);
    builder.MergeAttributes(htmlAttributes);
    sb.Append(builder.ToString(TagRenderMode.SelfClosing));
    sb.Append(RadioButtonLabel(inputIdSb.ToString(), listItem.Text, htmlAttributes));
    sb.Append("<br>");

    return sb.ToString();
}

public static string RadioButtonLabel(string inputId, string displayText,
                             IDictionary<string, object> htmlAttributes)
{
    var labelBuilder = new TagBuilder("label");
    labelBuilder.MergeAttribute("for", inputId);
    labelBuilder.MergeAttributes(htmlAttributes);
    labelBuilder.InnerHtml = displayText;

    return labelBuilder.ToString(TagRenderMode.Normal);
}


public static TProperty GetValue<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
    TModel model = htmlHelper.ViewData.Model;
    if (model == null)
    {
        return default(TProperty);
    }
    Func<TModel, TProperty> func = expression.Compile();
    return func(model);
}

#endregion

我是这样使用它的

代码语言:javascript
运行
复制
@Html.RadioButtonListFor(m => m.PlayFormat)

对于更复杂的用途,您可能需要更多代码来设置正确的元素名称。

如果枚举项具有Display属性,则显示名称。否则将显示枚举项。如果显示名称为null,则该值不会显示为选项。在这个枚举中,"None“不显示,"Singles”从枚举值中显示,“男人双打”和所有其他的显示文本(Name=“男人双打”)

代码语言:javascript
运行
复制
public enum PlayFormat
{
    [Display(Name=null)]
    None = 0,
    Singles = 1,
    [Display(Name = "Men's Doubles")]
    MenDoubles = 2,
    [Display(Name = "Women's Doubles")]
    WomenDoubles = 3,
    [Display(Name = "Mixed Doubles")]
    MixedDoubles = 4,
    [Display(Name = "Men's Group")]
    MenGroup = 5,
    [Display(Name = "Women's Group")]
    WomenGroup = 6,
    [Display(Name = "Mixed Group")]
    MixedGroup = 7
}

页面看起来像这样(除了每个-是一个单选按钮)

代码语言:javascript
运行
复制
- Singles
- Men's Doubles
- Women's Doubles
- Mixed Doubles
- Men's Group
- Women's Group
- Mixed Group
票数 4
EN

Stack Overflow用户

发布于 2012-07-16 22:52:01

这是我在互联网上找到的一个帮助器方法,它可以从枚举中创建一个下拉列表。您应该能够修改此代码以创建单选按钮,而不是下拉列表。

代码语言:javascript
运行
复制
namespace Localicy.HtmlHelpers {
    public static class HtmlHelperExtensions {
        private static Type GetNonNullableModelType(ModelMetadata modelMetadata) {
            Type realModelType = modelMetadata.ModelType;
            Type underlyingType = Nullable.GetUnderlyingType(realModelType);
            if (underlyingType != null)
                realModelType = underlyingType;

            return realModelType;
        }

        private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "", Value = "" } };

        public static string GetEnumDescription<TEnum>(TEnum value) {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if ((attributes != null) && (attributes.Length > 0))
                return attributes[0].Description;
            else
                return value.ToString();
        }

        public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression) {
            return EnumDropDownListFor(htmlHelper, expression, null, null);
        }

        public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, string defaultValueText) {
            return EnumDropDownListFor(htmlHelper, expression, defaultValueText, null);
        }

        public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, string defaultValueText, object htmlAttributes) {
            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
            Type enumType = GetNonNullableModelType(metadata);
            IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();
            IEnumerable<SelectListItem> items = from value in values
                                                select new SelectListItem {
                                                    Text = GetEnumDescription(value),
                                                    Value = value.ToString(),
                                                    Selected = value.Equals(metadata.Model)
                                                };

            // If the enum is nullable, add an 'empty' item to the collection
            if (metadata.IsNullableValueType || defaultValueText != null)
                if(defaultValueText != null) {
                    SelectListItem[] tempItem = new[] { new SelectListItem { Text = defaultValueText, Value = "" } };
                    items = tempItem.Concat(items);
                }
                else
                    items = SingleEmptyItem.Concat(items);
                //items = (new ).Concat(items)

            return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11506570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档