наследовать от 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 ответа:
Решение почему-то простое:
просто не разбирайте флаг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); } }
Причина, по которой это работает:
Контроль, который вызывает обратную передачу, получил информацию оТаким образом, ASP.net-engine сам выполнит соответствующие валидаторы и установит их в
- вызывает валидацию
- ValidationGroup
- и прочее
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); } }