1

データ注釈を介して SelectList を送信できますか? 何かのようなもの...

[UIHint("DropDownList", "", new SelectList(new[] {"one","two","three"}))]
public virtual int? OptionID { get; set; }

構文はわかりませんが、これは可能のようです。もしそうなら、エディタテンプレートからどのようにアクセスできますか?

そうでない場合、どうすれば SelectList を DropDownList Editor Template に動的に送信できますか? 特に、SelectList ごとに個別のテンプレートを作成することは避けたいと思います。テンプレートが多すぎます。ありがとう

編集: 15 音節のモンスターである DataAnnotationsModelMetadataProvider をオーバーライドするよりも直接的であると考えたため、2 番目のオプション (リフレクション) に取り組んでいます。

4

1 に答える 1

1

次のブログ記事をご覧ください。

http://mikevdm.com/BlogEntry/Key/Using-UIHint-With-ControlParameters-in-MVC

関連する引用は次のとおりです。

ControlParameters は、やや変わった構文で (コンパイル時の) 定数値のみを受け入れることができるという点で制限されていますが、単純な値 (true/false、列挙値など) を許可するため、テンプレート化されたヘルパーはベースでわずかに異なる動作をすることができます。パラメータについて。これにより、通常は個々のテンプレート (多くのコード重複) にある関連する機能を 1 つのテンプレートに組み合わせることができます。

私のアプリでは、すべてのドロップダウン リストが null 可能なブール値 (はい、いいえ、未設定) または列挙型のいずれかでした。それぞれに個別のテンプレートを作成する方法をとりましたが、ヘルパー メソッドを使用して各テンプレート内のコードを最小限に抑えました。

たとえば、Level (Levelは列挙型) というテンプレートがあります。

コードは、プラスを使用するカップルです....

@Html.DropDownListFor(model => model, Model.ToSelectList<Level>())

これらの拡張メソッドを次の目的で使用しますToSelectList

public static SelectList ToSelectList<TEnum>(this TEnum? value) where TEnum : struct
{
    var items = GetSelectListItems<TEnum>().ToList();
    items.Insert(0, new SelectListItem { Value = "", Text = LabelIfNull });
    return new SelectList(items, "Value", "Text", value.ToString());
}

public static SelectList ToSelectList<TEnum>(this TEnum value)
{
    var items = GetSelectListItems<TEnum>();
    return new SelectList(items, "Value", "Text", value.ToString());
}

public static IEnumerable<SelectListItem> GetSelectListItems<TEnum>()
{
    var values = System.Enum.GetNames(typeof(TEnum));
    return values.Select(v => new SelectListItem { Value = v, Text = v.ToFriendlyName() });
}

public static SelectList ToSelectList(this bool isTrue)
{
    var items = new[]
    {
        new SelectListItem { Value = "true", Text = LabelIfTrue },
        new SelectListItem { Value = "false", Text = LabelIfFalse }
    };
    return new SelectList(items, "Value", "Text", isTrue.ToString());
}

public static SelectList ToSelectList(this bool? isTrue)
{
    var items = new[]
    {
        new SelectListItem { Value = string.Empty, Text = LabelIfNull },
        new SelectListItem { Value = "true", Text = LabelIfTrue },
        new SelectListItem { Value = "false", Text = LabelIfFalse }
    };
    return new SelectList(items, "Value", "Text", !isTrue.HasValue ? string.Empty : isTrue.Value.ToString());
}

コントロール パラメーターを使用して 1 つのテンプレートを作成することもできますがDataAnnotationsModelMetadataProvider、ブログ投稿に示されているように、独自の を作成する必要があります。

于 2011-08-10T00:39:36.643 に答える