一尘不染

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

html

我是MVC的新手,我正在尝试创建自己的扩展方法,以便可以将其添加到剃刀视图中可用的html帮助器中。Html.DropDownListFor()使您可以为模型上的所有属性创建一个下拉列表。我想创建一个称为“
helper”的功能Html.StateDropDownListFor(),它的功能完全相同,只是将下拉列表加载到美国所有50个州中。这样,我不必为我创建的每个状态下拉列表都创建一个SelectList。最简单的方法是什么?现在我有这个:

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

我什至靠近吗?我不想重建整个文本框帮助程序,我只想创建一个利用现有文本框帮助程序但为我执行SelectList的帮助程序。在我看来,这样我可以做到Html.StateDropDownList(x => x.State)


阅读 291

收藏
2020-05-10

共1个答案

一尘不染

要在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>
    

将自定义帮助程序放入视图范围后,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()
2020-05-10