15

現在の DropDownList の実装には不満があります。なぜなら、オプション タグ (選択されたもの、テキスト、および値のみがサポートされている) を使って多くのことを行うことができないからです。個々のオプションで無効にしたり、その他のものを設定できる場所を自分で作りたいです。

現在、私は javascript でオプションを変更していますが、それを行うには少しハックな方法だと思います。最初は正しい html をレンダリングすることをお勧めします。

選択タグとオプションタグを使用するテンプレートを作成し、必要に応じてオプションを作成できることはわかっていますが、通常の DropDownList 拡張機能では、フォームを送信するときに適切なデータバインディング用であると思われるもの val と特定の名前と ID が追加されます。

<select data-val="true" data-val-number="The field SelectedValue must be a number." id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue">

これらの属性を独自のテンプレートに追加するにはどうすればよいですか?

4

1 に答える 1

30

おっしゃる通り、これらの属性 (特に name 属性) はモデル バインディングにとって重要です。

次のようなカスタム ヘルパーを作成するとします。

public static MvcHtmlString CustomHelperFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)

まずvar fieldName = ExpressionHelper.GetExpressionText(expression);、フィールド名を取得するために使用できます。

次にvar fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);、ネストされたビューを処理して、完全な名前を取得するために使用します。

最後に、 を使用してこれを id 属性に変換できますvar fieldId = TagBuilder.CreateSanitizedId(fullBindingName);

したがって、テキスト ボックスを作成する単純なカスタム ヘルパーは次のように記述できます。

public static MvcHtmlString CustomHelperFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{            
    var fieldName = ExpressionHelper.GetExpressionText(expression);
    var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
    var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);

    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var value = metadata.Model;

    TagBuilder tag = new TagBuilder("input");
    tag.Attributes.Add("name", fullBindingName);
    tag.Attributes.Add("id", fieldId);
    tag.Attributes.Add("type", "text");
    tag.Attributes.Add("value", value == null ? "" : value.ToString());

    var validationAttributes = html.GetUnobtrusiveValidationAttributes(fullBindingName, metadata);
    foreach (var key in validationAttributes.Keys)
    {
        tag.Attributes.Add(key, validationAttributes[key].ToString());
    }

    return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing));
}

次のようなビューで使用できます。

@Html.CustomHelperFor(model => model.ParentDropDown.SelectedValue)

そして、次の html が生成されます。

<input id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue" type="text" value="4">

それが役に立てば幸い!

于 2013-08-10T12:45:05.443 に答える