これが、MVCチームがどこでも文字列を使用するという決定に非常に不満を持っている理由です。クラスをテキストボックスに追加することは、TextBox HtmlHelperの関心事ではなく、HTML構築の別の側面である必要があります。これは、セマンティックモデルを使用してHtmlを定義するためのより良いソリューションです。ここではTagBuilderを使用しますが、FubuMvcに含まれているHtmlTagsライブラリを調べることを強くお勧めします。
public TagBuilder TextBox(this HtmlHelper helper, string name, string value)
{
var tag = new TagBuilder("input");
tag.MergeAttribute("type", "text");
tag.MergeAttribute("name", name);
tag.MergeAttribute("value", value);
return tag;
}
セマンティック(TagBuilder)モデルを返すので、HTMLリテラルに変換する前に、モデルを変更し続けることができます。ConditionallyAddClassは、任意のTagBuilderモデルにクラスを適用する再利用可能な拡張メソッドです。
public TagBuilder ConditionallyAddClass<T>(this TagBuilder tag, string @class, T model, Func<T, bool> condition)
{
if(condition(model))
{
tag.AddCssClass(@class);
}
return tag;
}
あなたの見解では、これを行うことができます(StyleAgeTextboxがブール型のプロパティであると仮定):
<%= Html.TextBox("Age", Model.Age).ConditionallyAddClass("customClass", Model, m => m.StyleAgeTextbox) %>
ビューエンジンは、TagBuilderでToString()を自動的に呼び出して、適切なHTMLを取得します。
これがあなたに基本的な考えを与えることを願っています。もちろん、これを拡張する方法はたくさんあります。標準の命名規則を使用して、dynamic
式を使用して回避するための型を使用するか、ルックアップテーブルを使用するか、メンバー式を使用するためにすべてを強く型指定することができます(例:TextBoxFor(m => m.Age))。私はFubuのようにすべてをhtmlコンベンションフレームワークに移動することを好みますが、それはおそらくほとんどのプロジェクトを超えています。