在ASP.NET MVC 3中添加自己的HtmlHelper

Che*_*hev 47 html c# asp.net asp.net-mvc asp.net-mvc-3

我是MVC的新手,我正在尝试创建自己的扩展方法,以便我可以添加到我的剃刀视图中可用的html助手.Html.DropDownListFor()允许您为模型上的任何属性创建下拉列表.我想创建一个叫做的帮助程序Html.StateDropDownListFor()完全相同的事情,除了加载美国所有50个州的下拉列表.这样我就不必为我创建的每个状态下拉列表创建一个SelectList.最简单的方法是什么?现在我有这个:

public static class ExtensionMethods
{
    public static MvcHtmlString StateDropDownList(this HtmlHelper html)
    {
        // ???
    }
}
Run Code Online (Sandbox Code Playgroud)

我甚至关闭了吗?我不想重建整个文本框助手,我只是想创建一个利用现有文本框助手的助手,但是为我做了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"));
    }
Run Code Online (Sandbox Code Playgroud)

我修改了上面的代码,使用字典来表示状态缩写.

只是不要忘记System.Web.Mvc.Html在你的扩展方法类的顶部引用,就像我忘记了,噢!

Dar*_*rov 70

要在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>
    
    Run Code Online (Sandbox Code Playgroud)

将自定义帮助器放入视图中的范围后,Intellisense应该能够选择它并且您可以使用它:

@Html.StateDropDownList()
Run Code Online (Sandbox Code Playgroud)

现在你帮助方法需要做一些有用的事情.你可以调用现有的助手:

public static class ExtensionMethods
{
    public static MvcHtmlString StateDropDownList(this HtmlHelper html)
    {
        return html.TextBox("foo")
    }
}
Run Code Online (Sandbox Code Playgroud)

或者返回一些自定义数据:

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

如果您有强类型视图并且想要使用表达式:

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 --"
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

@Html.StateDropDownList()
Run Code Online (Sandbox Code Playgroud)


Ber*_*ron 8

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 );
}
Run Code Online (Sandbox Code Playgroud)

会工作._stateList是一个IEnumerable<SelectListItem>.

  • 添加`using System.Web.Mvc.Html;`以使扩展方法可用. (2认同)