Я использую HtmlHelpers все время, чаще всего для инкапсуляции генерации шаблонного HTML, на случай, если я передумаю. У меня были такие помощники как:
- Html.BodyId (): генерирует обычный тег id тела для ссылки при добавлении пользовательского css для представления.
- Html.SubmitButton (string): генерирует элемент input [type = submit] или button [type = submit], в зависимости от того, как я хочу стилизовать кнопки.
- Html.Pager (IPagedList): для создания элементов управления подкачкой из модели списка с подкачкой.
- и т.д ....
Одним из моих любимых применений для HtmlHelpers является СУШКА разметки обычной формы. Обычно у меня есть контейнер div для строки формы, один div для метки и одна метка для ввода, сообщений проверки, текста подсказки и т. Д. В конечном итоге это может привести к множеству шаблонных тегов html. Вот пример того, как я справился с этим:
public static MvcHtmlString FormLineDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string labelText = null, string customHelpText = null, object htmlAttributes = null)
{
return FormLine(
helper.LabelFor(expression, labelText).ToString() +
helper.HelpTextFor(expression, customHelpText),
helper.DropDownListFor(expression, selectList, htmlAttributes).ToString() +
helper.ValidationMessageFor(expression));
}
public static MvcHtmlString FormLineEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string templateName = null, string labelText = null, string customHelpText = null, object htmlAttributes = null)
{
return FormLine(
helper.LabelFor(expression, labelText).ToString() +
helper.HelpTextFor(expression, customHelpText),
helper.EditorFor(expression, templateName, htmlAttributes).ToString() +
helper.ValidationMessageFor(expression));
}
private static MvcHtmlString FormLine(string labelContent, string fieldContent, object htmlAttributes = null)
{
var editorLabel = new TagBuilder("div");
editorLabel.AddCssClass("editor-label");
editorLabel.InnerHtml += labelContent;
var editorField = new TagBuilder("div");
editorField.AddCssClass("editor-field");
editorField.InnerHtml += fieldContent;
var container = new TagBuilder("div");
if (htmlAttributes != null)
container.MergeAttributes(new RouteValueDictionary(htmlAttributes));
container.AddCssClass("form-line");
container.InnerHtml += editorLabel;
container.InnerHtml += editorField;
return MvcHtmlString.Create(container.ToString());
}
public static MvcHtmlString HelpTextFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string customText = null)
{
// Can do all sorts of things here -- eg: reflect over attributes and add hints, etc...
}
Как только вы это сделаете, вы можете вывести строки формы следующим образом:
<%: Html.FormLineEditorFor(model => model.Property1) %>
<%: Html.FormLineEditorFor(model => model.Property2) %>
<%: Html.FormLineEditorFor(model => model.Property3) %>
... и BAM, все ваши метки, входные данные, подсказки и сообщения проверки находятся на вашей странице. Опять же, вы можете использовать атрибуты на своих моделях и размышлять над ними, чтобы стать по-настоящему умными и СУХИМИ. И, конечно, это было бы пустой тратой времени, если вы не можете стандартизировать дизайн вашей формы. Тем не менее, для простых случаев, когда css может предоставить все необходимые настройки, это работает grrrrrrrrreat!
Мораль истории - HtmlHelpers может оградить вас от глобальных изменений дизайна, разрушающих созданную вручную разметку в представлении после просмотра. Они мне нравятся. Но вы можете пойти за борт, и иногда частичные представления лучше, чем закодированные помощники. Общее практическое правило, которое я использую для выбора между вспомогательным и частичным представлением: если кусок HTML требует много условной логики или хитрости кодирования, я использую помощника (поместите код там, где должен быть код); если нет, то если я просто выводю общую разметку без особой логики, я использую частичное представление (поместите разметку там, где должна быть разметка).
Надеюсь, это даст вам некоторые идеи!