наследовать от asp: validationsummary


У меня есть требование показать красиво отформатированное сообщение об ошибке в верхней части страницы (или элемента управления).

Поэтому я реализовал метод рендеринга вновь созданного серверного элемента управления. новый созданный элемент управления наследуется от ValidationSummary.

public class AgValidationSummary : ValidationSummary
{
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        if(this.Enabled)
        {
            if (Page.IsPostBack && !Page.IsValid)
            {

Теперь моя проблема заключается в том, что если кнопка срабатывает и его свойство CausesValidation имеет значение false, моя validationsummary выдаст исключение, потому что я спрашиваю о странице.Свойство IsValid (и оно устанавливается только при наличии вызова на страницу.утверждать().

Есть ли у кого-нибудь решение этой проблемы?

3 2

3 ответа:

Решение почему-то простое:
просто не разбирайте флаг Page.IsValid:) вместо этого сделайте что-то подобное в вашем void Render(HtmlTextWriter writer):

if (!this.Enabled)
{
    return;
}

if (this.Page != null)
{
    this.Page.VerifyRenderingInServerForm(this);
}
else
{
    return;
}

var failedValidators = this.Page.Validators.OfType<BaseValidator>().Where(bv => string.Equals(bv.ValidationGroup, this.ValidationGroup) && !bv.IsValid).ToList();

if (failedValidators.Any())
{
    writer.Write(this.HeaderText);
    foreach (var failedValidator in failedValidators)
    {
        writer.Write(failedValidator.ErrorMessage);
    }
}

Причина, по которой это работает:
Контроль, который вызывает обратную передачу, получил информацию о

  1. вызывает валидацию
  2. ValidationGroup
  3. и прочее
Таким образом, ASP.net-engine сам выполнит соответствующие валидаторы и установит их в IsValid или нет.

Edit
Чтобы избавиться от исходный текст заголовка (который все еще отображается):

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    // overwrite to hide the original HeaderText
}

Возможно, вы можете сохранить свойство IsValid в ViewState и инициализировать его в true.

В нагрузку, проверить, если IsValid имеет значение NULL, если значение не равно null, установите функцию IsValid в отображение стоимости в разделе.Функция IsValid.

И в Render считайте IsValid из ViewState.

Здесь я могу сбиться с пути, но не можете ли вы просто подключить конструктор вашего элемента управления к событию проверки страницы?

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

private bool _thePageIsBeingValidated = false;

public bool ShouldIDoMyThing
{
     get{ return (_thePageIsBeingValidated && this.Enabled && this.Page.IsPostback && this.Page.IsValid != null && this.Page.IsValid == false); }
}