は、私は私の心を変更する場合には、すべての時間は、最も一般的に、定型HTMLの生成をカプセル化するHtmlHelpersを使用しています。私はそのようなヘルパーを持っていました:
- Html.BodyId():ビューのカスタムCSSを追加するときに参照するための従来のボディIDタグを生成します。
- Html.SubmitButton(文字列):私は、ボタンのスタイルを設定する方法に応じて、入力[タイプ=提出]またはボタン、[タイプ=提出]要素、のいずれかを生成します。
- Html.Pager(IPagedList):ページングされたリストモデルからページングコントロールを生成するため。
- など....
私がHtmlHelpersで好きな用途の1つは、一般的なフォームマークアップをDRYすることです。通常、フォームライン用のコンテナ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、すべてのラベル入力、ヒント、および検証メッセージがページに表示されます。ここでも、モデルの属性を使用して、それらを反映させることで、本当にスマートでDRYになることができます。もちろん、フォームデザインを標準化できない場合は、時間の無駄です。しかし、cssが必要とするすべてのカスタマイズを提供できる単純なケースでは、grrrrrrrrreatが動作します!
ストーリーのモラル - HtmlHelpersは、世界的なデザイン変更からあなたを守り、手作りのマークアップを見失った後に見ることができます。私は彼らが好き。しかし、あなたは船外に出ることができ、時には部分的なビューはコード化されたヘルパーよりも優れています。 一般的な経験則ヘルパーと部分ビューの間で決定するために私は使います:HTMLのチャンクが多くの条件付きロジックやコーディングトリッキーを必要とするなら、私はヘルパーを使います。そうでない場合は、あまりロジックを持たない一般的なマークアップを出力しているだけですが、部分的なビュー(マークアップが必要なマークアップを使用します)を使用します。
これはあなたにいくつかのアイデアを提供します。
私は、カスタムHTMLヘルパーで他の面白いことをやってみたいと思っています。気軽に投稿してください! – stephen776