В большинстве случаев при использовании расширений 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 расширений (код ниже), но есть две проблемы с этой базовой реализации:
- управления визуализирует на самом верху элемента тела, а не в положении в котором он помещен в поле зрения, и
- Ошибка 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();
}
}