2010-11-29 105 views
1

我有以下標記。 errorPanel第一次只用於顯示服務器端異常消息,並且正常工作。現在我想將我的驗證總結納入同樣的errorPanel。現在當驗證摘要變爲可見時,使驗證摘要的容器可見

<asp:Panel ID="errorPanel" runat="server" CssClass="error" Visible="false"> 
    <div style="float: right;"> 
     <a href="#" class="error-close" style="font-size: 10px">Close</a></div> 
    <asp:Label ID="errorLabel" runat="server"></asp:Label> 
    <asp:ValidationSummary ID="validationSummary" runat="server" EnableClientScript="true" /> 
</asp:Panel> 
<fieldset> 
    <legend>Create New Role</legend><asp:Label ID="newRoleNameLabel" runat="server" AssociatedControlID="newRoleNameText">Role Name:</asp:Label> 
    <asp:TextBox ID="newRoleNameText" runat="server" Width="100px"></asp:TextBox> 
    <asp:RequiredFieldValidator ID="newRoleNameRequired" runat="server" EnableClientScript="true" ControlToValidate="newRoleNameText" Display="Dynamic" ErrorMessage="Please enter a role name.">*</asp:RequiredFieldValidator> 
    <asp:Button ID="createButton" runat="server" Text="Create" OnClick="createButton_Click" /> 
</fieldset> 

我的問題是必要的驗證情況客戶端,我想繼續保持,所以我沒有服務器端的機會,使errorPanel可見,爲了使驗證摘要可見。

我看到我有兩個選擇:做驗證服務器端,並在那裏使用我的代碼使面板可見,或以某種方式掛接到客戶端代碼,並在應該使摘要顯示時捕獲事件,然後也使errorPanel可見。我怎麼能去關於後者?

回答

2

這是一個真正不被推薦的方法,但我很樂意編寫它,它可能會引導你一些有趣的想法!

(附註:我使用jQuery,使生活更輕鬆)

採取Visible="false"關你的ASP:面板,我們將做這一切的客戶端。

<asp:Panel ID="errorPanel" runat="server" CssClass="error"> 

現在,在文檔準備好的時候,我們將隱藏面板,並混淆ASP.NET的驗證代碼。

$(document).ready(function() { 
    // This is more like it! 
    $("#<% =errorPanel.ClientID %>").hide(); 
    eval('ValidatorCommonOnSubmit = ' + ValidatorCommonOnSubmit.toString().replace('return result;', 'myValidatorHook(result); return result;')); 
}); 

這EVAL需要它是由ASP.NET驗證產生的ValidatorCommonOnSubmit()功能,並修改它到位,因此只需將它返回其結果之前,它調用myValidatorHook()與結果。

(見this StackOverflow question對這裏也有我的想法)

現在,我們的鉤:

function myValidatorHook(validated) { 
    if (validated) { 
     $("#<% =errorPanel.ClientID %>").hide(); 
    } 
    else { 
     $("#<% =errorPanel.ClientID %>").show(); 
    } 
} 

夠簡單 - 如果驗證返回真(頁面驗證),隱藏面板;如果它返回false(頁面沒有驗證),顯示它。

使用需要您自擔風險!如果ASP.NET驗證器生成的JavaScript發生更改,這將會突然崩潰 - 但我確實在ASP.NET 2.0,3.5和4.0中測試了它,並且它們在所有三者中都一樣。

+0

它有一個很好的厚臉皮給它。 – ProfK 2010-11-29 15:17:52

0

我有一個類似的問題,我有一個包含div圍繞一組ASP驗證字段,我只想顯示容器是否有錯誤顯示。

我用jQuery隱藏容器,按照Carson63000的答案,但隨後使用jQuery來查看錯誤的可見性,並再次顯示容器,如果有可見的東西。

jQuery(function() { 
    jQuery(".checkout-validation").hide(); 
    var show = false; 
    jQuery(".checkout-validation span").each(function() { 
     if (jQuery(this).css('display') != 'none' && jQuery(this).css('visibility') != 'hidden') { 
      show = true; 
     } 
    }); 
    if (show == true) { 
     jQuery(".checkout-validation").show(); 
    } 
}); 

唯一的澄清等澄清我想補充的是,標準驗證字段默認設置爲visibility: hiddenDisplay="Dynamic"驗證是display: none

0

老問題,但無論如何。

我發現了一個簡單而乾淨的解決方案。沒有服務器端,沒有JavaScript需要。 您可以簡單地將您的內容errorPanel放在ValidationSummary控件的HeaderText中。 Like on on MSDN site

HeaderText屬性不是HTML編碼的。因此,HTML標籤可以包含在HeaderText中。

你舉的例子:

<asp:ValidationSummary ID="validationSummary" runat="server" EnableClientScript="true" CssClass="error" 
HeaderText='<div style="float: right;"><a href="#" class="error-close" style="font-size: 10px">Close</a></div><span ID="errorLabel" runat="server"></span>'/> 
<fieldset> 
... 

而且PLBlum還釘它Microsoft asp.net forum