2016-01-29 11 views
0

(使用ASP.NET Web窗體的Microsoft .NET Framework版本:4.0.30319,ASP.NET版本:4.0.30319.34274)RequiredFieldValidator的錯誤信息,並形成復位

我有一個asp:文本框域和用於該文本字段一個RequiredFieldValidator:

<asp:TextBox 
    runat="server" 
    ID="MyTextBox" /> 
<asp:RequiredFieldValidator 
    runat="server" 
    ID="RequiredUserName" 
    ControlToValidate="MyTextBox" 
    ErrorMessage="MyTextBox is required" 
    Display="None" /> 

當用戶提交頁面,我驗證它,然後清除表單,讓他們的用戶可以再次使用表格的形式。在Page_Load背後的代碼如下所示:

if (Page.IsPostBack) 
{ 
    Page.Validate(); 
    if (Page.IsValid) 
    { 
     SaveFormSubmissionToDatabase(); 
     MyTextBox.Text = ""; 
    } 
} 

所以,我確認一切,這Page.IsValid是真的,我保存用戶數據的形成,然後嘗試清除表單的用戶再次練習I.但是,由於表單被清除,RequiredFieldValid顯示錯誤消息,即使我已經運行Page.Validate()並且沒有再次運行它。

爲什麼會這樣,我能做些什麼來避免在清除表單後顯示此錯誤消息?更一般地說,爲什麼這個RequiredFieldValidator再次運行?

我應該注意到,錯誤信息實際上是在asp:ValidationSummary控件中顯示的。

(我想,也許客戶端驗證被觸發的錯誤信息顯示,所以我的RequiredFieldValidator的設置EnableClientScript="false",但這並沒有改變任何東西)


我研究這個問題了並發現了其他人有同樣的問題,但沒有解決方案。例如,This question。建議的解決方案是重定向到同一頁面,這不起作用,因爲我需要顯示一些關於剛剛提交的表單的信息,包括成功消息,如果我重定向,那麼信息將會丟失到同一頁面。

+0

你可以刪除錯誤,當你清除表單?這是一個解決方法 – erikscandola

+0

@erikscandola,我可以,但我想了解錯誤的來源,並在訴諸類似的東西之前查看是否有其他解決方案。 – nephets

回答

1

您得到該消息的原因是因爲對Page.Validate()的調用,這正如名稱所示。並且因爲每次回發都會調用驗證。

通常情況下,您不會將該代碼放在Page_Load中,而是放在提交按鈕的onClick中。

即:

protected void SubmitButton_OnClick(object sender, EventArgs e) 
    { 
     Page.Validate(); 
     if (Page.IsValid) 
     { 
      SaveFormSubmissionToDatabase(); 
      MyTextBox.Text = ""; 
     } 
    } 

更新:讓我提煉的原因。在原來的帖子中,MyTextBox.Text = ""不是最後發生的事情。頁面上的控件也會觸發它們的事件和驗證,這發生在Page_Load事件之後。

對於全生命週期參考:https://msdn.microsoft.com/en-us/library/ms178472.aspx#general_page_lifecycle_stages

+0

謝謝弗蘭克的幫助,但我不太明白這可能是怎麼回事。我對「Page.Validate()」的調用將「Page.IsValid」保留爲true,所以不應該有任何錯誤消息。然後我清除表單,以便用戶可以再次輸入它,並且所需的字段驗證程序失敗。爲什麼要把它放在代碼背後的不同部分,改變了相同調用的行爲方式? – nephets

+0

這是因爲'Page_Load'在頁面的生命週期中處於早期階段。所有的控件,包括驗證器,都會在Page_Load之後完成它們的工作,並找到頁面無效。 你可以通過設置'RequiredUserName.Enabled = false'來短路這個,然後在OnLoadComplete()中重新啓用它。 –

+0

有趣的是,我會嘗試將它放在點擊按鈕上,看看它是否讓我在任何地方。如果是這樣,我一定會標記你的答案!謝謝。 – nephets