Лучший способ глобально установить свойство ValidationGroup каждого элемента управления в asp.net?

StackOverflow https://stackoverflow.com/questions/1424577

  •  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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top