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

есть у кого решение проблемы?


person karlis    schedule 24.03.2009    source источник
comment
ответов больше нет?? что вы используете вместо сводки проверки?   -  person karlis    schedule 30.03.2009


Ответы (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. группа проверки
  3. и другие вещи

Таким образом, движок ASP.net сам выполнит соответствующие валидаторы и установит для них значение IsValid или нет.

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

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

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

В Load проверьте, является ли IsValid нулевым, если не нулевым, установите для IsValid в ViewState значение в Page.IsValid.

А в рендере читать IsValid из ViewState.

person Canavar    schedule 24.03.2009

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

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

private bool _thePageIsBeingValidated = false;

public bool ShouldIDoMyThing
{
     get{ return (_thePageIsBeingValidated && this.Enabled && this.Page.IsPostback && this.Page.IsValid != null && this.Page.IsValid == false); }
}
person Tristan Warner-Smith    schedule 24.03.2009