0

私は、ASP.NET MVC の学習を通じて、自分の道を歩んでいます。最近、ドロップダウン リストの項目を選択する必要があるかどうかを判断するのに役立つ拡張メソッドを作成しました。HTMLヘルパーメソッドについて知っています。ここで物事がどのように機能するかを学ぼうとしているだけです。とにかく、私は現在次のコードを持っています:

<select id="Gender">
  <option value="-1" @Html.IsSelected(Convert.ToString(ViewBag.Gender), "-1")>Unspecified</option>
  <option value="0" @Html.IsSelected(Convert.ToString(ViewBag.Gender), "0")>Male</option>
  <option value="1" @Html.IsSelected(Convert.ToString(ViewBag.Gender), "1")>Female</option>
</select>

これを実行すると、次のようなコンパイル エラーが表示されます。

 CS1973: 'System.Web.Mvc.HtmlHelper<dynamic>' has no applicable method named 'IsSelected' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

私の質問は、ViewBag の値を使用して拡張メソッドを実行するにはどうすればよいですか? ViewBag.Gender をハードコードされた値に置き換えると、機能します。問題は ViewBag が動的な型であるという事実にあると思います。しかし、他にどのような選択肢がありますか?

4

2 に答える 2

1

私は同じ問題を抱えていました。代わりに ViewData を使用してください。たとえば、次のように置き換えます。

 @using (Html.BeginSection(tag:"header", htmlAttributes:@ViewBag.HeaderAttributes)) {}

@using (Html.BeginSection(tag:"header", htmlAttributes:@ViewData["HeaderAttributes"])) {}

それは正常に動作します;)

于 2015-07-21T17:24:24.537 に答える
0

ここに役立つかもしれないものがあります:

public static class HtmlHelperExtensions
    {
public static MvcHtmlString GenderDropDownList(this HtmlHelper html, string name, int selectedValue, object htmlAttributes = null)
        {
            var dictionary = new Dictionary<sbyte, string>
            {
                { -1, "Unspecified" },
                { 0, "Male" },
                { 1, "Female" },
            };

            var selectList = new SelectList(dictionary, "Key", "Value", selectedValue);
            return html.DropDownList(name, selectList, htmlAttributes);
        }

        public static MvcHtmlString GenderDropDownListFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, bool?>> expression, object htmlAttributes = null)
        {
            var dictionary = new Dictionary<sbyte, string>
            {
                { -1, "Unspecified" },
                { 0, "Male" },
                { 1, "Female" },
            };

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

            var selectList = new SelectList(dictionary, "Key", "Value", selectedValue);
            return html.DropDownListFor(expression, selectList, htmlAttributes);
        }
}

次のように使用します。

@Html.GenderDropDownList("Gender", 0)

また:

@Html.GenderDropDownListFor(m => m.Gender)
于 2013-03-10T08:51:19.757 に答える