Добавление собственного HtmlHelper в ASP.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)
Ваши ответы очень ценятся.
Здесь ответ!
Ты, ребята, отличная помощь, спасибо! Вот законченный метод расширения в случае, если кто-либо еще использует его.
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
в верхней части вашего класса методов расширения, как я забыл, d'oh!
Ответы
Ответ 1
Чтобы использовать пользовательский вспомогательный метод в представлениях 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 --"
);
}
}
а затем:
@Html.StateDropDownList()
Ответ 2
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>
.