2009-03-24 2 views
2

У меня есть требование показать хорошо отформатированное сообщение об ошибке в верхней части страницы (или элемента управления).наследовать от 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 устанавливается в ложь мой ValidationSummary выбросит исключение, потому что я спрашиваю о Page.IsValid собственности (и это только установить, есть ли вызов к Page.validate().

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

+0

больше нет ответов ?? что вы, люди, вместо резюме проверки? – karlis

ответ

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. CausesValidati на
  2. ValidationGroup
  3. и другие вещи

Так сама ASP.net двигатель будет выполнять связанные с валидаторов и установить их IsValid или нет.

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

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

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

в Load, проверьте IsValid имеет значение null, если не null, s et your IsValid в ViewState до значения в Page.IsValid.

И в Render, прочитайте IsValid из ViewState.

0

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

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

private bool _thePageIsBeingValidated = false; 

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