2009-01-07 105 views
1

我有一個gridview包含一行到多行(像大多數做) - 每個都有一個輸入文本框。每行都有一個針對該文本框的requiredfieldvalidator。當表單被提交時,gridview被驗證完全有可能多於一行有一個空的文本框。這導致重複驗證消息,例如asp.net - gridview驗證 - 重複驗證消息問題

  • 請提供「名稱」字段中的文本
  • 請提供「名稱」字段中的文本
  • 請提供「名稱」字段中的文本

是否有可能鞏固這些郵件進入一條消息?

我知道可以通過設置驗證器類並繼承BaseValidator類來創建驗證器,BaseValidator類可以用來驗證gridview整體。但是,當它無效時,我會在每一行放置一張圖片,因此我應該想象我需要在每一行上分別使用驗證器。

回答

0

我會建議不要使用驗證程序摘要。

將驗證器的Text屬性或內部內容更改爲更適合您應用程序的內容。

例如...

<asp:Validator ID="X" ... runAt="server" Text="*" /> 

<asp:Validator ID="X" ... runAt="server">*</asp:Validator> 

或以顯示圖像...

<asp:Validator ID="X" ... runAt="server"><img src="../path.png" alt="Invalid" /></asp:Validator> 

我還樣式驗證改變到指向幫助光標並添加ToolTip屬性以顯示相同的錯誤消息。

2

這是一個使用CustomValidator並需要進行一些組織更改的解決方案。這需要回發,因爲CustomValidator驗證在服務器端執行。

這裏的設置:

  1. 對於每個顯示「請提供‘姓名’字段文本」的消息現有RequiredFieldValidators,你將需要設置:
    • EnableClientScript =」假「
    • ValidationGroup =」vgTxtName「(提供您自己的名稱)
    • ErrorMessage =」「(或者將其完全移除; CustomValidator現在將響應ible for this)
    您可以選擇不顯示任何內容(對用戶不太清楚)或顯示星號以指示哪個驗證器無效。
    選項1:
    • 顯示= 「無」
    選項2(優選的):
    • 顯示= 「動態」
    • 設置文本在驗證標籤之間:*
  2. 您的ValidationSummary控件無需進行任何更改(它應該是中性的,並且沒有設置ValidationGroup屬性,這是默認設置)
  3. 添加的CustomValidator(參見下面的代碼)
    • 添加事件處理程序爲的CustomValidator的的ServerValidate事件(你可以增加一倍,從設計師單擊它有它產生的)
    • 實現的事件處理程序邏輯(見下面的代碼)

的想法是不是直接讓頁面再處理那些RequiredFieldValidators相反,我們將讓的CustomValidator做到這一點。

文本框的RequiredFieldValidator例如(你應該有一些看起來像這樣有關的ID名稱對應上面的步驟1):

選項1:

<asp:RequiredFieldValidator ControlToValidate="txt1" ID="rfv1" runat="server" 
EnableClientScript="false" Display="None" ValidationGroup="vgTxtName" /> 

選項2:

<asp:RequiredFieldValidator ControlToValidate="txt1" ID="rfv1" runat="server" 
EnableClientScript="false" Display="Dynamic" ValidationGroup="vgTxtName">* 
</asp:RequiredFieldValidator> 

CustomValidator標記(您可以將第是明智的任何地方,比如旁邊ValidationSummary控件):

<asp:CustomValidator ID="cvName" runat="server" Display="None" 
ErrorMessage="Please provide text for 'Name' field" 
OnServerValidate="cvName_ServerValidate" /> 

錯誤消息在這裏取代了個人驗證的人。另外請注意,沒有ControlToValidate集合,它對此類驗證器有效,對於應用包含多個控件的驗證非常有用。

的CustomValidator事件處理(cvName_ServerValidate):

protected void cvName_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    // Validate vgTxtName group 
    Page.Validate("vgTxtName"); 

    // .NET 3.5 - add using System.Linq; 
    args.IsValid = Page.GetValidators("vgTxtName") 
         .OfType<RequiredFieldValidator>() 
         .All(v => v.IsValid); 

    // .NET 2.0 (use either this or the above, not both) 
    bool isValid = true; 
    foreach (RequiredFieldValidator validator in Page.GetValidators("vgTxtName")) 
    { 
     isValid &= validator.IsValid; 
    } 
    args.IsValid = isValid; 
} 

這就是它!請記住,這僅限於RequiredFieldValidators。您不應在「vgTxtName」組中放置不同類型的驗證程序,因爲cvName邏輯嚴格處理RequiredFieldValidator類型。如果您打算使用其他驗證器類型,則需要設置不同的分組或調整代碼。