2011-07-27 225 views
1

所以我有一個ASP.NET/VB Web應用程序,我在其中使用RequiredFieldValidators和CustomValidators。不過,我在所有的驗證中都遇到了一些重大問題。當您單擊「下一步」按鈕轉到表單的下一頁而未填寫必填字段時,所有RequiredFieldValidators都會觸發並顯示錯誤消息,但過了一會兒,它仍會轉到下一頁。有時在改變代碼中不相關的部分之後,它會再次開始工作,並在一段時間內工作,直到我改變其他東西。 CustomValidators更加不一致,有時會工作,有時會觸發,但不會阻止用戶移動到下一頁,有時甚至根本不工作,但只是在更改代碼時停止/開始工作,看起來應該不會影響它。有時一個人工作,一個人不工作。這讓我瘋狂的是什麼似乎是如此隨機。我似乎無法確定代碼中的哪些更改實際上會影響這一點。有沒有人有任何想法?是否有什麼會一次影響頁面上的所有驗證?這裏是我的一些代碼,如果需要,我也可以發佈一些代碼。驗證問題

必填字段驗證:

<asp:RequiredFieldValidator ID="rfvFirstName" ControlToValidate="txtFirstName" runat="server"SetFocusOnError="true" ErrorMessage="Required"></asp:RequiredFieldValidator> 

自定義驗證:

<asp:CustomValidator ID="cvRequired" runat="server" ControlToValidate="txtCourseNum" Enabled="true" ErrorMessage=""></asp:CustomValidator> 
<asp:CustomValidator ID="cvDuplicate" runat="server" ControlToValidate="txtCoursePrefix" Enabled="true" ErrorMessage=""></asp:CustomValidator> 

下一步按鈕:

<asp:Button ID="btnNextA" runat="server" Text="Next" OnClick="btnNext_Click" UseSubmitBehavior="true" CausesValidation="true" /> 
+0

您的自定義驗證器是否實際執行任何操作?您尚未設置ValidateFunction(服務器或客戶端)。 – Rezler

+0

是的,它在後面的代碼中連接起來(ServerValidate事件) – Sara

回答

4

薩拉,確保不應該被確認具有的CausesValidation按鈕設置爲false。另外,如果您最終發佈了驗證信息,請確保在假設事物有效之前查看Page.IsValid屬性。驗證器將在回發事件之前觸發。你的下一個按鈕是否回傳 - 如果是,請檢查。

我敢打賭,如果您第一次加載頁面,並且沒有在必填字段中輸入值,那麼您將無法進入下一頁。但是,如果您對所需值有一個值,您將看到驗證器啓動,但您將進入下一頁。下一個按鈕的代碼應該檢查Page.IsValid屬性。

驗證令人困惑的原因是,一些驗證器默認情況下會發生客戶端(例如必需的字段驗證器),而一些會發生在服務器端(比如自定義驗證器,其服務器端方法訂閱了它們的事件)。如果客戶端驗證程序失敗,則永遠不會將其發送到服務器。另外,如果客戶端驗證器通過你的服務器端驗證器將運行,但是....這是棘手的部分,你的回發處理器將在驗證器激發後觸發。因此,如果您在回發處理程序中重定向(假設回發是由點擊按鈕引起的),那麼即使您的服務器端驗證程序失敗,您也將被重定向,因此您的驗證程序看起來不起作用。它可能工作,但你可能沒有檢查Page.IsValid屬性。

同樣需要注意的是,順序是非常重要的:

  • 客戶端驗證,
  • 服務器端驗證,
  • 那麼你的回發事件

我不會發誓在一堆聖經上(因爲我沒有一堆聖經),但是你認爲不一致的行爲很可能是你實際上沒有以相同的順序執行。如果你沒有在必填字段中填寫任何內容,那麼你永遠不應該回傳。如果您在必填字段中添加了某項內容,並且您的某個服務器端驗證程序失敗,那麼您將回發,但如果您未對Page.IsValid進行測試,則它將顯示爲驗證程序無法正常工作。 事件處理程序。

+0

就像ek_ny提到的那樣,確保在轉到下一頁之前檢查「if(Page.IsValid)」。 – jdmonty

+0

@jdmonty - 謝謝。 –

+0

謝謝,檢查Page.IsValid是否爲所需的字段驗證器和其中一個自定義驗證器工作。仍然有一個自定義驗證器的問題,但我認爲這是一個無關的問題,如果我無法解決它,我可能會發佈一個單獨的問題。謝謝你的幫助! – Sara

0

首先,將驗證組放在驗證器和按鈕上。如果這也不起作用,把OnClientClick ='CheckValidate();'並聲明將與參數..驗證組一起調用page_clientvalidate方法的函數。 這肯定會奏效。如果這不起作用,將調試器放在javascript方法中並調試相同

+0

是的。也使用螢火蟲,並檢查是否有任何js錯誤發生。 – Rezler