大多數時候使用DevEx MVC擴展時,我發現自己必須使用重複代碼來生成定期使用的控件/佈局。例如,我傾向於選擇左對齊的標題來控制。理想情況下,我能夠做這樣的事,並把它「只是工作」:用於打包其他擴展的HTML擴展
@Html.DevExpress().TextBoxFor(m => m.Notes).GetHtml()
然而,爲了將標題左邊,我還需要通過在設置對象吧或圓頂一些更詳細的如:
@Html.DevExpress().TextBox(
s => {
// ...
s.Properties.CaptionCellStyle.Width = 100;
// ...
}
).Bind(Model.Notes).GetHtml()
我認爲做的是創造我自己的一組將包裹DevEx擴展,給我某種共同/核心定製層的擴展,所以我可以做這樣的事情:
@Html.MyComponents().TextBoxFor(m => m.Notes)
該調用將依次調用DevExpress TextBoxExtension和一組常用設置,並根據需要輸出DevEx文本框。
我通過自定義HTML擴展工作這件事(下面的代碼),但有兩個問題與此基本實現:
- 控件呈現在Body元素的最頂端,而不是在位置它被放置在視圖中,並且
- 有一個JavaScript錯誤「ASPxClientTextBox」未定義(這是DevEx在其控件中使用的客戶端腳本的一部分)。
我希望這將是一個簡單的「包裝它去」類型的場景。這些自定義HTML擴展的缺失有一些基本概念嗎?或者是否有人知道這是否是試圖包裝另一家公司的預先存在的擴展的一般限制?
這裏是我已經實現的代碼(這還沒有完全突顯出來,只是想爲概念證明這裏):
public static class HtmlHelpers
{
public static MyComponentsHtmlHelpers<TModel> MyComponents<TModel>(this HtmlHelper<TModel> html) {
return new MyComponentsHtmlHelpers<TModel>(html);
}
}
public class MyComponentsHtmlHelpers<TModel>
{
private HtmlHelper<TModel> html;
public MyComponentsHtmlHelpers(HtmlHelper<TModel> html) {
this.html = html;
}
public MvcHtmlString TextBoxFor<TValue>(Expression<Func<TModel, TValue>> expression) {
var data = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string propertyName = data.PropertyName;
System.Diagnostics.Debug.WriteLine("PROPERTY NAME: " + propertyName);
TextBoxSettings s = new TextBoxSettings();
s.Name = "textbox_" + propertyName;
s.Properties.Caption = propertyName;
s.Properties.CaptionCellStyle.Width = 100;
TextBoxExtension tb = new TextBoxExtension(s);
return tb.GetHtml();
}
}