Лучший способ глобально установить свойство ValidationGroup каждого элемента управления в asp.net?
-
07-07-2019 - |
Вопрос
У меня есть пользовательский элемент управления с элементами формы, который многократно используется в большом веб-приложении, и до этого момента .aspx, который использует пользовательский элемент управления, обрабатывает сводку проверки при неверной отправке формы. / р>
Теперь мне нужно установить свойство ValidationGroup во время выполнения для каждого из моих элементов управления элементов формы (текстовые поля, списки, валидаторы и т. д.). Вместо того, чтобы делать это вручную, устанавливая каждый элемент управления, я заинтересован в том, чтобы перебрать все элементы управления в пользовательском элементе управления, определить, имеет ли этот элемент управления свойство ValidationGroup, и установить его значение таким образом. Р>
Примерно так:
For Each ctrl As System.Web.UI.Control In Me.Controls
' so now what is the proper way to detect if this control has the ValidationGroup property
Next
Пример кода в vb.net или c # работает для меня. Большое спасибо!
Решение
Ваш UserControl должен предоставлять свойство, которое правильно устанавливает свойство ValidationGroup внутри себя. Р>
Управляющая разметка в .ASPX:
<ctl:yourcontrol id="whatever" runat="server" YourValidationGroupProp="HappyValidationName" />
Управляющий код позади .ASCX:
protected override void OnPreRender(EventArgs e)
{
someControl.ValidationGroup = YourValidationGroupProp;
someControl1.ValidationGroup = YourValidationGroupProp;
someControl2.ValidationGroup = YourValidationGroupProp;
//......etc
}
public string YourValidationGroupProp{ get; set; }
Другие советы
Создайте пользовательский элемент управления, наследующий, например, литерал. Этот элемент управления будет помощником.
Вы вставите его на страницу и сделаете всю грязную работу за вас. например выходной код [который занял бы много времени для написания] основан на некоторой логике, и как только вы закончите с ней.
Получите этот автоматический код (который будет иметь большой вес, если бы его фактически выполнял каждый раз другой элемент управления), удалите вспомогательный элемент управления и жестко закодируйте новый код в любом месте.
Таким образом, вы избегаете всех ошибок, заставляя компьютер определять желаемый код, и вы получаете всю жестко запрограммированную скорость, которая пострадает при решении проблемы с помощью универсального метода.
Я просто искал то же самое, и это внезапно поразило меня. Я использую этот метод для других целей [сканировать все элементы управления & amp; выводить некоторый код инициализации], но я думаю, вы могли бы использовать этот метод, чтобы легко сделать это!
Я только что написал это и собираюсь поделиться с вами
public class ValidationCodeProducerHelper : Literal
{
// you can set this in the aspx/ascx as a control property
public string MyValidationGroup { get; set; }
// get last minute controls
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
// start scanning from page subcontrols
ControlCollection _collection = Page.Controls;
Text = GetCode(_collection).Replace("\r\n", "<br/>");
}
private string GetCode(Control _control)
{
// building helper
StringBuilder _output = new StringBuilder();
// the logic of scanning
if (_control.GetType().GetProperty("ValidationGroup") != null && !string.IsNullOrEmpty(_control.ID))
{
// the desired code
_output.AppendFormat("{0}.{1} = {2};", _control.ID, "ValidationGroup", MyValidationGroup);
_output.AppendLine();
}
// recursive search within children
_output.Append(GetCode(_control.Controls));
// outputting
return _output.ToString();
}
private string GetCode(ControlCollection _collection)
{
// building helper
StringBuilder _output = new StringBuilder();
foreach (Control _control in _collection)
{
// get code for each child
_output.Append(GetCode(_control));
}
// outputting
return _output.ToString();
}
}