2012-03-07 13 views
6

我們經常接觸到.NET驗證問題上的元件被使用javascript/CSS的隱藏(即顯示:無)忽略.NET驗證器如果元件是隱藏的(顯示:無)

例如(有可能是語法錯誤,但不要擔心)

<asp:CheckBox ID="chkNewsletter" runat="server" Checked="true" /> 
... 
<div id='newsletterOnly'> 
    <asp:TextBox ID="txtEmail" runat="server" /> 
    <asp:RequiredFieldValidator ID="vldEmail" ControlToValidate="txtEmail" ErrorMessage="Required" runat="server" /> 
</div> 

用JavaScript:

$('#chkNewsletter').changed(function() { 
    $(this).is(':checked') ? $('#newsletterOnly').show() : $('#newsletterOnly').hide(); 
}); 

它不應該驗證txtEmail如果被隱藏。
你不能提交表單,如果newsletterOnly是隱藏的,因爲儘管它已經被隱藏:(
你甚至看不到驗證錯誤消息,因爲它隱藏

是對的RequiredFieldValidator仍然有效有沒有解決這個我想我可以修改.NET JavaScript來驗證時,纔可見控制什麼辦法?

我試圖避免回傳給改善用戶體驗。

+0

您是否嘗試禁用隱藏的元素?我希望這是解決方案。 – 2012-03-07 04:39:16

+0

在發佈到服務器時使用兩種不同視圖模型的可能性如何:針對每種不同情況使用兩種視圖模型?你只需要發佈到兩條不同的路線。 – Eli 2012-03-07 04:40:13

+0

或者,您需要在javascript中進行驗證,而不是在服務器上進行驗證。 – arcynum 2012-03-07 04:40:27

回答

9

我寫了這作爲一個通用的解決方案(可以在所有.NET網站上使用)。

你只需要添加一個OnClientClick到提交按鈕。

//=================================================================== 
// Disable .NET validators for hidden elements. Returns whether Page is now valid. 
// Usage: 
// <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="DisableHiddenValidators()" /> 
//=================================================================== 
function DisableHiddenValidators() { 
    for (var i = 0; i < Page_Validators.length; i++) { 
    var visible = $('#' + Page_Validators[i].controltovalidate).is(':visible'); 
    ValidatorEnable(Page_Validators[i], visible) 
    } 
    return Page_ClientValidate(); 
} 

要使用它,只是包括上述JavaScript和類OnClientClick="DisableHiddenValidators()"添加到提交按鈕:

<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="DisableHiddenValidators()" /> 

編輯: jQuery的$(submitButton).click功能並未在iPhone/Android的工作。我稍微改變了上面的示例代碼。

如果任何人看到任何錯誤或可能的改進請評論:)

+0

除非我做錯了什麼。這會禁用頁面上的所有驗證器。即使是可見的? – Obsidian 2014-05-30 10:27:11

+0

它不應該。可見變量是否爲您正確設置? – Aximili 2014-06-03 00:13:59