programing

ASP에서 사용자 고유의 HtmlHelper를 추가합니다.NET MVC 3

padding 2023. 9. 15. 20:49
반응형

ASP에서 사용자 고유의 HtmlHelper를 추가합니다.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)

Razor 보기에서 맞춤 도우미 방법을 사용하려면 해당 방법을 범위에 넣어야 합니다.이를 수행할 수 있는 두 가지 방법이 있습니다.

  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>
    

사용자 지정 도우미가 보기 범위에 포함되면 Intelliense에서 해당 도우미를 선택할 수 있으며 다음을 사용할 수 있습니다.

@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()
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>.

(질문 작성자를 대신하여 답변을 게시하여 답변 섹션으로 이동합니다.

정답은 이렇습니다.

다른 사람이 사용할 경우를 대비해 완성된 확장 방법을 소개합니다.

    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내가 잊었던 것처럼 당신의 확장 방법 수업의 맨 위에 있습니다.

언급URL : https://stackoverflow.com/questions/5052752/adding-your-own-htmlhelper-in-asp-net-mvc-3

반응형