web-dev-qa-db-ja.com

ASP.NET MVC 3に独自のHtmlHelperを追加する

私はMVCを初めて使用し、独自の拡張メソッドを作成して、かみそりビューで使用可能なhtmlヘルパーに追加できるようにしています。 Html.DropDownListFor()を使用すると、モデルのプロパティのドロップダウンリストを作成できます。 Html.StateDropDownListFor()というヘルパーを作成します。これはまったく同じことを行いますが、ドロップダウンに米国の50州すべてをロードします。このように、作成するすべての状態ドロップダウンごとにSelectListを作成する必要はありません。これを行う最も簡単な方法は何ですか?今私はこれを持っています:

_public static class ExtensionMethods
{
    public static MvcHtmlString StateDropDownList(this HtmlHelper html)
    {
        // ???
    }
}
_

私も近いですか?テキストボックスヘルパー全体を再構築するのではなく、既存のテキストボックスヘルパーを利用するが、SelectListを実行するヘルパーを作成したいだけです。そうすれば、私の意見ではHtml.StateDropDownList(x => x.State)

あなたの答えは大歓迎です。

答えはこちら!

皆さん、とても助かります、ありがとう!他の誰かがそれを使用したことがある場合の完全な拡張メソッドを以下に示します。

_    public static MvcHtmlString StateDropDownListFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        Dictionary<string, string> stateList = new Dictionary<string, string>()
        {
            {"AL"," Alabama"},
            {"AK"," Alaska"},
            {"AZ"," Arizona"},
            {"AR"," Arkansas"},
            {"CA"," California"},
            {"CO"," Colorado"},
            {"CT"," Connecticut"},
            {"DE"," Delaware"},
            {"FL"," Florida"},
            {"GA"," Georgia"},
            {"HI"," Hawaii"},
            {"ID"," Idaho"},
            {"IL"," Illinois"},
            {"IN"," Indiana"},
            {"IA"," Iowa"},
            {"KS"," Kansas"},
            {"KY"," Kentucky"},
            {"LA"," Louisiana"},
            {"ME"," Maine"},
            {"MD"," Maryland"},
            {"MA"," Massachusetts"},
            {"MI"," Michigan"},
            {"MN"," Minnesota"},
            {"MS"," Mississippi"},
            {"MO"," Missouri"},
            {"MT"," Montana"},
            {"NE"," Nebraska"},
            {"NV"," Nevada"},
            {"NH"," New Hampshire"},
            {"NJ"," New Jersey"},
            {"NM"," New Mexico"},
            {"NY"," New York"},
            {"NC"," North Carolina"},
            {"ND"," North Dakota"},
            {"OH"," Ohio"},
            {"OK"," Oklahoma"},
            {"OR"," Oregon"},
            {"PA"," Pennsylvania"},
            {"RI"," Rhode Island"},
            {"SC"," South Carolina"},
            {"SD"," South Dakota"},
            {"TN"," Tennessee"},
            {"TX"," Texas"},
            {"UT"," Utah"},
            {"VT"," Vermont"},
            {"VA"," Virginia"},
            {"WA"," Washington"},
            {"WV"," West Virginia"},
            {"WI"," Wisconsin"},
            {"WY"," Wyoming"},
            {"AS"," American Samoa"},
            {"DC"," District of Columbia"},
            {"FM"," Federated States of Micronesia"},
            {"MH"," Marshall Islands"},
            {"MP"," Northern Mariana Islands"},
            {"PW"," Palau"},
            {"PR"," Puerto Rico"},
            {"VI"," Virgin Islands"},
            {"GU"," Guam"}
        };
        return html.DropDownListFor(expression, new SelectList(stateList, "key", "value"));
    }
_

状態の略語に辞書を使用するように上記のコードを変更しました。

忘れてしまったように、拡張メソッドクラスの先頭で_System.Web.Mvc.Html_を参照することを忘れないでください!

47
Chev

Razorビューでカスタムヘルパーメソッドを使用するには、スコープに組み込む必要があります。これを行うには2つの方法があります。

  1. ビューの一番上に、ヘルパーを含む静的クラスが定義されている名前空間を持つ@using SomeNamespaceを追加します
  2. ~/Views/web.configに次を追加します。

    <system.web.webPages.razor>
        <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <pages pageBaseType="System.Web.Mvc.WebViewPage">
                <namespaces>
                    <add namespace="System.Web.Mvc" />
                    <add namespace="System.Web.Mvc.Ajax" />
                    <add namespace="System.Web.Mvc.Html" />
                    <add namespace="System.Web.Routing" />
                    <add namespace="SomeNamspace" />
                </namespaces>
            </pages>
        </system.web.webPages.razor>
    

カスタムヘルパーがビューのスコープに取り込まれると、Intellisenseがそれを選択できるようになり、使用できるようになります。

@Html.StateDropDownList()

今、あなたのヘルパーメソッドは何か役に立つことをする必要があります。既存のヘルパーを呼び出すことができます:

public static class ExtensionMethods
{
    public static MvcHtmlString StateDropDownList(this HtmlHelper html)
    {
        return html.TextBox("foo")
    }
}

または、いくつかのカスタムデータを返します。

public static class ExtensionMethods
{
    public static MvcHtmlString StateDropDownList(this HtmlHelper html)
    {
        return MvcHtmlString.Create("Hello world");
    }
}

強く型付けされたビューがあり、式を使用したい場合:

using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class ExtensionMethods
{
    public static MvcHtmlString StateDropDownList(
        this HtmlHelper<MyViewModel> html
    )
    {
        var stateList = new SelectList(new[]
        {
            new { Key = "Alabama", Value = "Alabama" },
            new { Key = "Idaho", Value = "Idaho" },
            new { Key = "California", Value = "California" }
        }, "Key", "Value");
        return Html.DropDownListFor(
            x => x.State, stateList, "-- Select a state --"
        );
    }
}

その後:

@Html.StateDropDownList()
70
Darin Dimitrov
using System.Web.Mvc.Html;
public static MvcHtmlString StateDropDownList<TModel, TValue>( this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression ) {
        return html.DropDownListFor( expression, _stateList );
}

動作します。 _stateListIEnumerable<SelectListItem>

8
Bertrand Marron