Проверка пользовательского элемента управления ASP.NET с его родительской страницы - PullRequest
7 голосов
/ 01 ноября 2008

У меня есть страница asp.net с кнопкой. Эта кнопка генерирует и вставляет пользовательский элемент управления на страницу, поэтому на одной странице может существовать много элементов управления. Мне нужно проверить, что существует определенный динамически сгенерированный элемент управления внутри сгенерированного элемента управления.

Итак ... Страница имеет от 0 до N элементов Control1. Каждый элемент Control 1 может иметь от 0 до N элементов Control2. Когда кнопка SaveButton нажата на странице, мне нужно убедиться, что внутри каждого элемента Control1 есть хотя бы 1 элемент Control2.

В настоящее время я нахожусь между двумя вариантами:

• Динамически вставлять CustomValidators для каждого сгенерированного элемента управления, каждый из которых будет проверять один Control1.

• Выполните проверку вручную (с помощью jQuery), вызвав функцию проверки из SaveButton.OnClientClick.

Оба по-своему неряшливы - вот почему я делюсь этим со всеми вами. Я упускаю простое решение?

Заранее спасибо .. (кстати, все, что связано с .NET 3.5 SP1 включительно, является честной игрой)

Ответы [ 4 ]

8 голосов
/ 02 ноября 2008

Хм, мне нравится идея интерфейса, предложенная digiguru, но я бы использовал интерфейс на контейнере Control1 вместо субэлементов управления, так как это кажется более логичным местом для кода. Вот мой взгляд на это:

public interface IValidatableControl
{
    bool IsValidControl();    
}

, затем внедрите это в свой Control1

public class Control1 : IValidatableControl
{
... Other methods
    public bool IsValidControl()
    {

        foreach(object c in this.Controls)
        {
            if(c.GetType() == "Control2")
                return true;
        }
        return false;
    }

}

Возможно, есть лучшие способы написать это, но это должно дать вам достаточно идеи, чтобы начать.

2 голосов
/ 01 ноября 2008

Если вы добавляете пользовательские элементы управления на лету, вы можете заставить каждый элемент управления реализовывать один и тот же интерфейс с функцией проверки. Таким образом, вы можете загрузить элементы управления в заполнитель в каждом родительском элементе управления на странице. Когда страница отправлена, просто переберите элементы управления в заполнителе, приведите их к классу интерфейса и затем вызовите функцию validate. Я не использую пользовательские валидаторы, но вы можете создать список ошибок валидации, используя объект, возвращенный функцией validate, вы можете отобразить эту коллекцию ошибок валидации любым удобным вам способом.

1 голос
/ 21 ноября 2008

Я думаю, вы могли бы сделать это, назначив открытое свойство в Control1, которое ссылается на существование идентификатора Control2, а затем украсить класс Control1 с помощью ValidationProperty. Я думаю что-то вроде этого:

[ValidationProperty("Control2Ref")]
public partial class Control1 : UserControl
{
    public string Control2Ref
    {
        get { return FindControl("Control2"); }
    }
    // rest of control 1 class
}

И тогда вы сможете указать RequiredFieldValidator на экземпляр Control1.

0 голосов
/ 01 ноября 2008

Один из способов, который вы можете попробовать, - это создание и поддержка простой структуры XML, которая представляет вашу пользовательскую иерархию управления. Вставьте или удалите из этой структуры каждый раз, когда вы создаете или уничтожаете пользовательский элемент управления. После сохранения проверьте правильность иерархии элементов управления, представленной в структуре xml. Вы можете сохранить xml в объекте Session, чтобы сохранить его в постбэках.

...