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

У меня есть пользовательский элемент управления с элементами формы, который значительно повторно используется в большом веб-приложении, и до этого момента .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 # работает для меня. Большое спасибо!

Ответы [ 2 ]

1 голос
/ 12 апреля 2010

Создание пользовательского элемента управления, наследующего, например, литерал. Этот элемент управления будет помощником.

Вы вставите его на страницу, и он сделает всю грязную работу за вас. например выходной код [который занял бы много времени для написания] основан на некоторой логике, и как только вы закончите с этим.

Получите этот автоматический код (который будет иметь большой вес, если бы его фактически выполнял каждый раз другой элемент управления), удалите вспомогательный элемент управления и жестко закодируйте новый код в любом месте.

Таким образом, вы избегаете всех ошибок, заставляя компьютер вычислять код, который вы хотите, как хотите, и вы получаете всю жестко запрограммированную скорость, которая пострадает при решении проблемы с помощью универсального метода.

Я просто искал то же самое, и это внезапно поразило меня. Я использую этот метод для других целей [отсканируйте все элементы управления и выведите некоторый код инициализации], но я думаю, вы могли бы также использовать этот метод, чтобы легко сделать это!

Я только что написал и собираюсь поделиться с вами

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();
    }
}
1 голос
/ 15 сентября 2009

Ваш 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; }
...