[英]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.