Пользовательский валидатор ASP.NET-форм не запускается - PullRequest
10 голосов
/ 15 апреля 2011

У меня есть пользовательский валидатор на моей странице для управления загрузкой файлов.

<asp:FileUpload ID="fuVendorBrief" runat="server" />
<br />
<asp:CustomValidator ID="cvVendorBriefFile" Display="Dynamic" runat="server" ValidationGroup="EditorValidate" ControlToValidate="fuVendorBrief" OnServerValidate="cvVendorBriefFile_ServerValidate" ErrorMessage="You must upload a vendor brief PDF file.">     
</asp:CustomValidator>

У меня также есть кнопка.

<asp:Button ID="btnSubmit" ValidationGroup="EditorValidate" OnClick="btnSubmit_Click" runat="server" Text="Add Vendor Brief" />

Я определил свое пользовательское событие валидатора кактак что ...

protected void cvVendorBriefFile_ServerValidate(object source, ServerValidateEventArgs args)
{
    CustomValidator fileUploadValidator = (CustomValidator)source;
    FileUpload vendorBriefFileUpload = (FileUpload)fileUploadValidator.Parent.FindControl(fileUploadValidator.ControlToValidate);
    args.IsValid = vendorBriefFileUpload.HasFile && vendorBriefFileUpload.FileName.ToLower().EndsWith(".pdf");
}

Этот пользовательский валидатор даже не запускается.Может быть, я просто устал, но все выглядит хорошо для меня, поэтому понимание важно.Если я удаляю точку останова где-либо в событии проверки сервера, она не срабатывает, когда я нажимаю кнопку Отправить.Однако я могу нажать точки останова в событии нажатия кнопки отправки.

Любые идеи?

РЕДАКТИРОВАТЬ - Забыл упомянуть, что у меня есть другие элементы управления валидацией, такие как обязательные валидаторы полей,на странице, и они запускаются просто отлично.

РЕДАКТИРОВАТЬ 2 - Если вы хотите полный источник страницы и ее код позади, то перейдите по следующим ссылкам:

Дайте мне знать, если вы видите что-то странное.Я наполовину сплю здесь и надеюсь, что мне чего-то не хватает.

Ответы [ 5 ]

20 голосов
/ 15 апреля 2011

Попробуйте удалить ControlToValidate полностью. Хотя я никогда не пытался проверить загрузку файла, большинство валидаторов не будут запускаться (за исключением RequiredField), если содержимое пустое. Снятие контроля для проверки должно привести к тому, что он будет срабатывать всегда для этой группы.

РЕДАКТИРОВАТЬ (Chevex) - проблема была ControlToValidate, но не потому, что она была сломана. По умолчанию он не будет срабатывать для элементов управления без значения, как указано выше. Установка пользовательского свойства элемента управления валидатора ValidateEmptyText="true" решает проблему. Грустно, что мне пришлось начать этот гигантский вопрос, чтобы найти это, но теперь мы знаем! :)

1 голос
/ 14 июля 2016

Для меня это произошло, когда валидатор и связанный с ним вход находились внутри элемента управления, для которого было установлено visible="false" в разметке элемента управления. Это заставляло CustomValidator наследовать свойство Visible = false и препятствовало запуску проверки. При обычной загрузке страницы я не делал элементы управления видимыми до тех пор, пока в жизненном цикле страницы не будет.

В любом случае, если вы установите точку останова для метода Page.Validate(), вы можете проверить коллекцию Page.Validators и посмотреть, может ли с вами случиться подобное.

1 голос
/ 15 апреля 2011

Вам нужно указать ту же группу ValidationGroup = "" для вашей кнопки и для ваших валидаторов

0 голосов
/ 15 апреля 2011

Если вы посмотрите на документацию по http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(%22ASP%3aCUSTOMVALIDATOR%22);k(VS.HTMLDESIGNER.HTML);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV3.5%22);k(DevLang-ASPX)&rd=true

, то увидите

При использовании элементов управления валидатора вы должны всегда проверять результаты проверки на стороне сервера перед выполнением какой-либо обработки,После обратной передачи, но до вызова методов событий, страница вызывает элементы управления validator и объединяет их результаты в свойство Page.IsValid.(Вы также можете вызвать элементы управления validator явно, используя метод Validate.) В своем собственном коде вы должны проверить, что свойство Page.IsValid возвращает true перед обработкой ввода.Даже если браузеры с поддержкой сценариев могут предотвратить возникновение обратной передачи на клиенте, если проверка не пройдена, вы всегда должны также проверять Page.IsValid в коде сервера перед обработкой проверенных данных.

Итак,в тестировании на Page.IsValid в вашей загрузке страницы?

0 голосов
/ 15 апреля 2011

Добавьте CausesValidation="True" к объявлению кнопки.

...