Подтвердить что ты не робот

Добавление собственного HtmlHelper в ASP.NET MVC 3

Я новичок в 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 в верхней части вашего класса методов расширения, как я забыл, d'oh!

4b9b3361

Ответ 1

Чтобы использовать пользовательский вспомогательный метод в представлениях Razor, вам нужно будет ввести его в объем. Это можно сделать двумя способами:

  • Добавить @using SomeNamespace в верхней части вашего представления с пространством имен, в котором указан статический класс, содержащий вспомогательный элемент
  • В ~/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()

Ответ 2

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 );
}

Будет работать. _stateList является IEnumerable<SelectListItem>.