簡體   English   中英

ASP.NET Web 表單自定義驗證器未觸發

[英]ASP.NET Web-forms custom validator not firing

我的頁面上有一個用於文件上傳控件的自定義驗證器。

<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 - 如果您想要頁面的完整源代碼及其代碼隱藏,請點擊以下鏈接:

嘗試完全刪除ControlToValidate 盡管我以前從未嘗試過驗證文件上傳,但如果內容為空,大多數驗證器都不會觸發( RequiredField除外)。 取消對驗證的控制應該使它始終為該組觸發。

編輯(Chevex)- ControlToValidate是問題,但不是因為它壞了。 默認情況下,它不會觸發沒有值的控件,如上所述。 設置自定義驗證器控件屬性ValidateEmptyText="true"可以解決該問題。 很遺憾我不得不開始這個巨大的問題才能找到它,但現在我們知道了! :)

對我來說,當驗證器及其相關輸入位於控件標記中設置了visible="false"的控件內時,就會發生這種情況。 這導致 CustomValidator 繼承Visible = false屬性並阻止驗證觸發。 在正常的頁面加載中,我直到頁面生命周期的后期才使控件可見。

在任何情況下,如果您在Page.Validate()方法上設置斷點,您可以檢查Page.Validators集合,看看是否可能發生類似的事情。

您需要為按鈕和驗證器指定相同的 ValidationGroup=""

CausesValidation="True"添加到您的 Button 聲明中。

如果您查看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

你看

使用驗證器控件時,應始終在執行任何處理之前檢查服務器端驗證的結果。 在回發之后但在調用事件方法之前,頁面調用驗證器控件並將它們的結果聚合到 Page.IsValid 屬性中。 (您也可以使用 Validate 方法顯式調用驗證器控件。)在您自己的代碼中,您應該在處理輸入之前檢查 Page.IsValid 屬性是否返回 true。 如果驗證檢查失敗,即使啟用腳本的瀏覽器可能會阻止在客戶端上發生回發,您也應該始終在處理驗證數據之前檢查服務器代碼中的 Page.IsValid。

那么,是否在測試頁面加載中的Page.IsValid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM