наследовать от asp: validationsummary - PullRequest
2 голосов
/ 24 марта 2009

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 12 июня 2009

решение как-то легко:
только не разбирайте флаг 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. CausesValidation
  2. ValidationGroup
  3. и другие вещи

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

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

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    // overwrite to hide the original HeaderText
}
0 голосов
/ 24 марта 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); }
}
0 голосов
/ 24 марта 2009

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

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

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

...