c# - 在 ASP.NET MVC 3 中添加你自己的 HtmlHelper

标签 c# asp.net html asp.net-mvc asp.net-mvc-3

我是 MVC 的新手,我正在尝试创建我自己的扩展方法,以便我可以添加到我的 razor View 中可用的 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 View 中使用自定义帮助器方法,您需要将其纳入范围。有两种可能的方法可以做到这一点:

  1. 在您的 View 顶部添加一个 @using SomeNamespace,其中包含定义包含助手的静态类的 namespace
  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>
    

一旦自定义助手被引入 View 的范围内,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");
    }
}

如果你有一个强类型 View 并且你想使用一个表达式:

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

关于c# - 在 ASP.NET MVC 3 中添加你自己的 HtmlHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5052752/

相关文章:

c# - 如何使用 window.open() 传递变量?

asp.net - 什么是经常损坏的 app_offline.htm hack 的建议替代方案?

c# - 将对象设置为 null 而不将其作为 ref 传递

c# - 如何定义继承泛型抽象类的泛型抽象类?

c# - 将信息发送到数据库中的特定列 C#

php - 将 PHP Web 服务和 ASP.NET 网站连接到同一个 MySQL

html - 如何使两列布局具有等高列和一个可滚动列?

javascript - 过渡不起作用

html - 页脚重叠内容 - HTML 和 CSS

c# - MongoDb C# 驱动程序在一个原子操作中更新多个文档