2

問題:

enumプロパティとしてGenderを持つ強い型のモデルをバインドする必要があります。また、リソースファイルからの表示テキストを表示するのが好きです。

私のモデルは

public enum GenderViewModel
{
  [Display(Name = "Male", ResourceType = typeof(Resources.Global), Order = 0)]
  Male,
  [Display(Name = "Female", ResourceType = typeof(Resources.Global), Order = 1)]
  Female

}

最初に、http://romikoderbynew.com/2012/02/23/asp-net-mvc-rendering-enum-dropdownlists-radio-buttons-and-listboxes/をフォローしてみました

しかし、それは少し複雑で、HTMLを修正することができませんでした。

それから私はstackoverflowからのシンプルで簡単な実装の外観を持っていました、MVC3のhtml.radiobuttonに列挙型を渡します

以下のようにcshtmlでHtmlHelperを使用しました

@Html.RadioButtonForEnum(m => m.Gender)

HTML生成

<label for="_Gender_Male">
 <input type="radio" value="Male" name="Gender" id="_Gender_Male" 
 data-val-required="Gender is required" data-val="true" checked="checked">
 <span class="radiotext">Male</span>
</label>

<label for="_Gender_Female">
<input type="radio" value="Female" name="Gender" id="_Gender_Female">
<span class="radiotext">Female</span></label>

それは本当にシンプルで、私にとってはうまく機能します。しかし、リソースファイルから値を取得していません。私のアプリケーションは多言語対応であり、さまざまな言語をサポートするためにグローバルリソースファイルを使用しています。

問題:

私の現在の文化はsv-seであるため、表示される男性は男性であり、表示される女性はKvinnaである必要があります。

HTMLを適切に制御できる簡単なソリューションを提供できる人はいますか?

4

2 に答える 2

5

あなたがしなければならないのはmy original helperそれが考慮に入れるように適応することですDisplayAttribute

public static class HtmlExtensions
{
    public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression
    )
    {
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        if (!metaData.ModelType.IsEnum)
        {
            throw new ArgumentException("This helper is intended to be used with enum types");
        }

        var names = Enum.GetNames(metaData.ModelType);
        var sb = new StringBuilder();

        var fields = metaData.ModelType.GetFields(
            BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public
        );

        foreach (var name in names)
        {
            var id = string.Format(
                "{0}_{1}_{2}",
                htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
                metaData.PropertyName,
                name
            );
            var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
            var field = fields.Single(f => f.Name == name);
            var label = name;
            var display = field
                .GetCustomAttributes(typeof(DisplayAttribute), false)
                .OfType<DisplayAttribute>()
                .FirstOrDefault();
            if (display != null)
            {
                label = display.GetName();
            }

            sb.AppendFormat(
                "<label for=\"{0}\">{1}</label> {2}",
                id,
                HttpUtility.HtmlEncode(label),
                radio
            );
        }
        return MvcHtmlString.Create(sb.ToString());
    }
}

これで、いくつかの列挙値をDisplayAttributeで装飾した場合、値はリソースファイルから取得されます。

于 2013-01-01T11:51:50.673 に答える
0

必要なリソースを使用するnameために使用する拡張メソッドで置き換える必要があります。<label>

私がここから適応させたこのようなコードを使用する必要があります:

var type = typeof(metaData.ModelType);
var memInfo = type.GetMember(name);
var attributes = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
var description = ((DisplayAttribute)attributes[0]).GetDescription();

そして、に入れdescriptionます<label>

私はそれをテストしていません!

于 2012-12-31T15:35:18.317 に答える