DevEx MVC拡張機能を使用しているとき、私は自分が定期的に使用するコントロール/レイアウトを生成するために繰り返しコードを使用する必要があります。たとえば、コントロールには左揃えのキャプションが優先されます。理想的には、私はこのような何かを行うことができる、それが「ただ働き」があるだろう:その他の拡張機能をラップするHTML拡張機能
@Html.DevExpress().TextBoxFor(m => m.Notes).GetHtml()
しかし、左側にキャプションを配置するために、私は設定は、それ用のオブジェクトでも渡す必要があります、またはドームはるかに冗長のような何か:私が何を考え何を
@Html.DevExpress().TextBox(
s => {
// ...
s.Properties.CaptionCellStyle.Width = 100;
// ...
}
).Bind(Model.Notes).GetHtml()
は私に共通/コアのカスタマイズ層のいくつかの並べ替えを与える、デベックス拡張を包むでしょう拡張子の私自身のセットを作成しましたので、私は可能性次のようなことをしてください:
@Html.MyComponents().TextBoxFor(m => m.Notes)
この呼び出しは、DevExpress TextBoxExtensionを共通の設定で呼び出し、必要に応じてDevExテキストボックスを出力します。
私はカスタムHTMLの拡張機能(以下コード)を介してこれを働いてきたが、この基本的な実装には2つの問題があります。
- を制御がない位置で、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();
}
}