4

EditorFor および DisplayFor ヘルパー メソッド用にいくつかの MVC テンプレートを作成し、Twitter Bootstrap フレームワークを使用して思いどおりにスタイルを設定しました。これで、必要なすべてのビットに対して有効なソリューションが得られましたが、状態のリストを表示するために設定した 1 つの部分を一般化したいと思います。ユーザーの住所のドロップダウンに表示する State 列挙型 (米国のすべての州のリストを含む) があります。[DataType] 属性を使用して、MVC で State.cshtml テンプレートを使用できるようにしました。

[Required]
[Display(Name = "State")]
[DataType("State")]
public State State { get; set; }

したがって、うまく機能しますが、 DataType("Enum") のようなことや、すべての列挙型に対してこのテンプレートを一般的にヒットする他の方法を実行できるように変更したいと思います。

テンプレートは次のようになります。

@using System
@using System.Linq
@using Beno.Web.Helpers
@using TC.Util

@model Beno.Model.Enums.State

<div class="control-group">
    @Html.LabelFor(m => m, new {@class = "control-label{0}".ApplyFormat(ViewData.ModelMetadata.IsRequired ? " required" : "")})
    <div class="controls">
        <div class="input-append">
            @Html.EnumDropDownListFor(m => m)
            <span class="add-on">@(new MvcHtmlString("{0}".ApplyFormat(ViewData.ModelMetadata.IsRequired ? " <i class=\"icon-star\"></i>" : "")))</span>
        </div>
        @Html.ValidationMessageFor(m => m, null, new {@class = "help-inline"})
    </div>
</div>

EnumDropDownListFor は、以前に投稿したヘルパー メソッドであり、あらゆる列挙型で一般的に機能します。私が知らないのは、このテンプレートを変更して、モデルオブジェクトとして一般的な列挙型を取得するにはどうすればよいですか?

更新:完全を期すために、EnumDropDownListFor メソッドのリストを含めます。

public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) where TProperty : struct, IConvertible
{
    if (!typeof(TProperty).IsEnum)
        throw new ArgumentException("TProperty must be an enumerated type");

    var selectedValue = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model.ToString();
    var selectList = new SelectList(from value in EnumHelper.GetValues<TProperty>()
                                    select new SelectListItem
                                                {
                                                    Text = value.ToDescriptionString(),
                                                    Value = value.ToString()
                                                }, "Value", "Text", selectedValue);

    return htmlHelper.DropDownListFor(expression, selectList, htmlAttributes);
}

モデル タイプを Enum に変更すると、ヘルパー メソッドの呼び出しのある行で次のエラーが発生します。

CS0453: The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'TProperty' in the generic type or method 'Beno.Web.Helpers.ControlHelper.EnumDropDownListFor<TModel,TProperty>(System.Web.Mvc.HtmlHelper<TModel>, System.Linq.Expressions.Expression<System.Func<TModel,TProperty>>, object)'

次に、TProperty が列挙型であり、struct where 制約であるかどうかのチェックを削除すると、以下の列挙値を取得しようとしている行でコンパイル エラーが発生します。

System.ArgumentException: Type 'Enum' is not an enum

私がここでしようとしていることをするのは不可能なのだろうか。

4

4 に答える 4

1

EditorTemplateを作成するだけですEnum.cshtml

あなたがしなければならないのはこの行を変更することだけです:

@model Beno.Model.Enums.State

このため :

@model System.Enum

そうすれば、それを使ってどれでも使用できるようになりますEnum

キャッチ:エンジンはアイテムの基本クラスを推測できないため、TestEnumにはEnumテンプレートが割り当てられないため、明示的に呼び出す必要があります。

@Html.EditorFor(model => model.EnumValue, "Enum") 
于 2013-01-21T21:23:32.113 に答える
0

私があなたの意味を正確に理解しているかどうかはわかりませんが、これを試してください:

@Html.DropDownListFor(model => model.EnumName, new SelectList(Enum.GetValues(typeof(Namespace.Models.EnumName))))

EnumName=あなたの場合の状態。

上記を使用して、TwitterBootstrapを使用して列挙型をドロップダウンリストに追加しました。

于 2013-01-21T23:59:29.730 に答える
0

他の人が示しているように、カスタム ヘルパーを作成するのが道です。これはまさにTwitterBootstrapMVCで行われたことです。他のヘルパーの中には、次のDropDownListFromEnumFor(...)ように使用する helper があります。

@Html.Bootstrap().DropDownListFromEnumFor(m => m.SomeEnum)

また

@Html.Bootstrap().DropDownListFromEnum("SomeEnum")

BMVC の優れた点は、拡張メソッドを使用してドロップダウンをカスタマイズできることです。その一部は通常の html 用で、その他は Bootstrap 固有です。以下にその一部を示します。

@(f.ControlGroup().DropDownListFromEnumFor(m => m.SomeEnum)
    .Append("something")
    .AppendIcon("glyphicon glyphicon-chevron-right")
    .Class("cool-dd")
    .OptionLabel("-- Select --")
    .Tooltip("cool tooltip"))

ああ、そうです、上記の例では、完全なコントロール グループ (入力、ラベル、および検証メッセージ) が生成されます。


免責事項: 私は TwitterBootstrapMVC の作成者です

于 2013-11-13T18:00:09.530 に答える