J'utilise les HtmlHelpers tout le temps, le plus souvent pour encapsuler la génération de HTML standard, au cas où je changerais d'avis. J'ai eu des aides telles que :
- Html.BodyId() : génère une balise d'identification de corps conventionnelle à laquelle il est possible de se référer lors de l'ajout de css personnalisés pour une vue.
- Html.SubmitButton(string) : génère un élément input[type=submit] ou button[type=submit], en fonction de la manière dont je souhaite styliser les boutons.
- Html.Pager(IPagedList) : Pour générer des contrôles de pagination à partir d'un modèle de liste paginée.
- etc....
L'une de mes utilisations préférées des HtmlHelpers est de déshydrater le balisage des formulaires courants. En général, j'ai une div conteneur pour une ligne de formulaire, une div pour l'étiquette, et une étiquette pour l'entrée, les messages de validation, le texte d'indication, etc. En fin de compte, cela peut se traduire par un grand nombre de balises html de type "boilerplate". Voici un exemple de la manière dont j'ai géré cette situation :
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...
}
Une fois que vous avez fait cela, vous pouvez sortir des lignes de formulaire comme ceci :
<%: Html.FormLineEditorFor(model => model.Property1) %>
<%: Html.FormLineEditorFor(model => model.Property2) %>
<%: Html.FormLineEditorFor(model => model.Property3) %>
... et BAM, toutes vos étiquettes, entrées, conseils et messages de validation sont sur votre page. Encore une fois, vous pouvez utiliser des attributs sur vos modèles et réfléchir sur eux pour devenir vraiment intelligent et DRY. Et bien sûr, ce serait une perte de temps si vous ne pouviez pas standardiser la conception de votre formulaire. Cependant, pour les cas simples, où css peut fournir toute la personnalisation dont vous avez besoin, cela fonctionne grrrrrrrrreat !
Morale de l'histoire : les HtmlHelpers peuvent vous protéger des changements de conception globaux qui détruisent les balises élaborées à la main, vue après vue. Je les aime bien. Mais on peut aller trop loin, et parfois des vues partielles sont préférables à des aides codées. Une règle générale que j'utilise pour décider entre l'aide et la vue partielle : Si le morceau de HTML nécessite beaucoup de logique conditionnelle ou d'astuces de codage, j'utilise une aide (mettre le code là où il doit se trouver) ; sinon, si je ne fais qu'afficher un balisage commun sans trop de logique, j'utilise une vue partielle (mettre le balisage là où il doit se trouver).
J'espère que cela vous donnera quelques idées !
1 votes
Je suis toujours intéressé de voir les autres choses intéressantes que les gens ont faites avec les Custom HTML Helpers. N'hésitez pas à les publier !