3

助けが必要です。列挙型のラジオボタンのグループが必要なビューを構築しようとしています。私はこのようないくつかの列挙型(クラス)を持っています:

[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を使用)では、列挙型データコントラクトに次のプロパティがあります。

    [DataMember(Order = 23)]
    [Display(Name = "EnumValue", Description = "EnumValue_Description", ResourceType = typeof(TextResource))]
    public OneEnumDataContract EnumClass1 { get; set; }

私の見解では、(ヘルパーを使用して)次のようなラジオボタンのグループを作成しようとします。

@Html.RadioButtonListEnum("EnumList1", Model.EnumClass1)

私のヘルパー:

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の最初の列挙値が得られます。データコントラクト内のすべての列挙値をヘルパーに取り込むにはどうすればよいですか?NoneRadioOptions

4

2 に答える 2

4

これは私が最近作成したものです。非列挙型で試してみると機能しませんが、私の列挙型のニーズには機能します。投稿されたnikeaaのようなさまざまなDropDownListヘルパーからビットとピースをコピーしました。

#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

私はこのように使用します

@Html.RadioButtonListFor(m => m.PlayFormat)

より複雑な使用のために正しい要素名を設定するには、より多くのコードが必要になる場合があります。

列挙型アイテムにDisplay属性がある場合、名前が表示されます。それ以外の場合は、列挙型アイテムが表示されます。表示名がnullの場合、その値はオプションとして表示されません。この列挙型では、「None」は表示されず、「Singles」は列挙型の値「Men's Doubles」から表示され、他のすべての列挙型には[Display(Name = "Men's Doubles")]からのテキストがあります。

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
}

ページは次のようになります(それぞれを除く-はラジオボタンです)

- Singles
- Men's Doubles
- Women's Doubles
- Mixed Doubles
- Men's Group
- Women's Group
- Mixed Group
于 2012-07-16T18:56:24.073 に答える
1

これは、列挙型からドロップダウンリストを作成するためにインターネットで見つけたヘルパーメソッドです。ドロップダウンの代わりにラジオボタンを作成するようにこのコードを変更できるはずです。

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);
        }
    }
}
于 2012-07-16T14:52:01.280 に答える