2011-06-30 28 views
2

寫作正在使用自動回一個下拉列表一個自定義的驗證。似乎完全忽略了驗證。爲什麼它被忽略,並且有一個簡單的解決方法?的CustomValidator的下拉列表不被調用(顯然)

注意,我沒有使用的ControlToValidate

asp.net:

 <asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional" Visible="true" RenderMode="Inline"> 
     <ContentTemplate> 
     <asp:DropDownList ID="ddlCommandAssign" runat="server" AutoPostBack="true"> 
     </asp:DropDownList> 
      <asp:CustomValidator id="val_command_assigned" runat="server" 
      ErrorMessage="* " 
      display="Static" 
      OnServerValidate="commandAssigned" 
      /> 
       </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="ddlCommandAssign" 
       EventName="SelectedIndexChanged" /> 
     </Triggers> 

    </asp:UpdatePanel> 

代碼背後:

Sub commandAssigned(ByVal source As Object, _ 
    ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) 

    Dim s As String 
    s = ddlCommandAssign.SelectedValue 
    'if s = "1" then 
    ' args.IsValid = true 
    'else 
    ' args.IsValid = False 
    'end if 
    args.IsValid = False 
End Sub 

出於調試目的,我希望它每次都失敗。

它似乎並沒有在所有執行後面的代碼。

對於調試,我加了線的Response.Redirect(「dummy.html」)...永遠也不會被調用,這也預示(我認爲)驗證不會被調用。

+0

我還添加了ValidateEmptyText = 「true」 以驗證。仍然沒有運氣。 – elbillaf

+0

重要的是讓你通過回傳驗證它嗎?你是否反對在客戶端做這件事?另外,是否有你沒有使用ControlToValidate的原因。我注意到你沒有,就像你說的,但我不知道爲什麼。 –

+0

我正在根據用戶首先選擇的值更改下拉列表。 (我*討厭*這個,但用戶習慣於舊系統的工作方式)。我想我需要使用autopostback更新ddl後,我改變它。我試着用和不用controltovalidate。我根據我在半打網站上閱讀的信息嘗試過。 (不知道這個建議有多可靠,但我通常假設讓它工作的人知道我不知道的東西。) – elbillaf

回答

2

刪除更新面板,並嘗試使用javascript來做驗證在客戶端本身。

客戶端驗證

JavaScript事件的定義,

function ValidateFunction(sender,args) 
{ 
    var ddlCommandAssign= document.getElementById('<%=ddlCommandAssign.ClientID %>'); 
    if (ddlCommandAssign.options[control.selectedIndex].value=='0') 
    { args.IsValid = false;//This shows the validation error message and stops execution at client side itself.} 
    else { args.IsValid = true;//This will return to the server side. }  
} 

.aspx的部分:

<asp:DropDownList ID="DropDownList1" runat="server"> 
     <asp:ListItem Value="1">select</asp:ListItem> 
     <asp:ListItem Value="2">sdasda</asp:ListItem> 
    </asp:DropDownList> 
    <asp:CustomValidator ID="valCustmID" runat="server" ErrorMessage="*" ForeColor="Red" 
     ValidationGroup="group1" ClientValidationFunction="ValidateFunction"></asp:CustomValidator> 
    <asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="group1" /> 

注:兩個自定義驗證和觸發按鈕應該具有相同的驗證組。

服務器端驗證

如果你真的想驗證服務器端看到下面的代碼:

 <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:DropDownList ID="DropDownList1" runat="server"> 
       <asp:ListItem Value="1">select</asp:ListItem> 
       <asp:ListItem Value="2">sdasda</asp:ListItem> 
      </asp:DropDownList> 
      <asp:CustomValidator ID="CustomValidator1" OnServerValidate="commandAssigned" runat="server" ErrorMessage="*" ValidationGroup="group1"></asp:CustomValidator> 
      <asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="group1" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

注:兩個自定義驗證和觸發按鈕應該具有相同的驗證組。後面的事件

代碼看起來如下:

protected void commandAssigned(object source, ServerValidateEventArgs args) 
    { 
     if (DropDownList1.SelectedItem.Value == "1")    
      args.IsValid = false; //since you gave controlToValidate="DropDownList1" this will display the error message.  
     else   
      args.IsValid = true;    
    } 

希望這有助於..

+1

您應該永遠不要僅依靠客戶端代碼來執行驗證。如果需要,您可以將它與服務器端驗證結合使用,但在所有情況下仍應驗證服務器端。 –

+0

將嘗試。我使用更新面板,因爲我正在改變ddl(對於用戶致力於我將取代的遺產) - 我想我需要更新面板重新顯示,但我會按照你的建議去做,看看是什麼發生。謝謝 – elbillaf

+0

Frederic,謝謝你對這個的補充。我會牢記這一點,並致力於服務器端解決方案,但我仍然會嘗試他的解決方案,看看它是否讓我更接近。我很絕望。 – elbillaf

1

指定控件使用恰當地命名ControlToValidate性能驗證:

<asp:CustomValidator id="val_command_assigned" runat="server" 
    ErrorMessage="* " Display="Static" OnServerValidate="commandAssigned" 
    ControlToValidate="ddlCommandAssign" /> 

否則,自定義驗證情況下不會執行任何驗證。

+0

感謝您的迴應。我剛剛開始,但沒有奏效。不過,我現在再試一次來確認。仍然不起作用。我把它拿出來是因爲我發現許多引用說如果控件返回一個空字符串,驗證將不會被調用。 (它曾經,但我改變了。) – elbillaf

+0

@TheFallibleFiend,我不認爲空字符串限制適用於自定義驗證無論如何。如果臨時移除'UpdatePanel',處理程序是否會被調用? –

+0

我剛剛嘗試過 - 但即使在刪除更新面板後仍然無法啓動。 我應該考慮過之前嘗試過。 – elbillaf

2

我面臨同樣的問題..但終於得到了解決。 只有當您的下拉列表中沒有項目添加時纔會發生。