這就是爲什麼我對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 does這樣的html約定框架中,但這可能超出了大多數項目。
我已經知道了第2號,並希望避免這一點(正如我在我的問題中寫的)。我可能會嘗試直接查看/使用MVC源代碼,除非其他人有指示如何執行此操作。 – Alex 2009-08-18 07:33:09