我是MVC的新手,我正在尝试创建自己的扩展方法,以便可以将其添加到剃刀视图中可用的html帮助器中。Html.DropDownListFor()使您可以为模型上的所有属性创建一个下拉列表。我想创建一个称为“ helper”的功能Html.StateDropDownListFor(),它的功能完全相同,只是将下拉列表加载到美国所有50个州中。这样,我不必为我创建的每个状态下拉列表都创建一个SelectList。最简单的方法是什么?现在我有这个:
Html.DropDownListFor()
Html.StateDropDownListFor()
public static class ExtensionMethods { public static MvcHtmlString StateDropDownList(this HtmlHelper html) { // ??? } }
我什至靠近吗?我不想重建整个文本框帮助程序,我只想创建一个利用现有文本框帮助程序但为我执行SelectList的帮助程序。在我看来,这样我可以做到Html.StateDropDownList(x => x.State)
Html.StateDropDownList(x => x.State)
要在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 --" ); } }
然后: