[英]Retrieve HiddenField Server Side
我發現了幾篇相似但不完全是我想要做的帖子。 我的 aspx 中有一個保存按鈕。 我在事件處理程序中有一些邏輯來檢查某些條件,如果它們滿足,那么我需要一個彈出窗口要求確認以繼續。 由於這是在一些處理之后發生的,而不是在單擊按鈕后立即發生的,所以我在后端調用它。
CS
Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "MyFunction()", true);
JavaScript
<script type="text/javascript">
function MyFunction() {
if (confirm("Do you want to continue?") == true) {
document.getElementById('<%=HiddenField1.ClientID %>').value = "True";
} else {
document.getElementById('<%=HiddenField1.ClientID %>').value = "False";
}
}
</script>
aspx
<asp:HiddenField ID="HiddenField1" runat="server"/>
這一切都很好。 我接下來需要做的是在后端我需要基於 HiddenField 進行額外處理:
if (HiddenField1.Value == "True")
{
FinishProcessing();
}
else
{
// Do nothing
}
問題是我必須單擊按鈕兩次才能獲得結果,就像我需要回發才能獲得 HiddenValue。 我不希望使用 Server.Transfer 進行回發,因為我需要在表單上保留幾個元素,盡管我認為 UpdatePanel 可以解決這個問題。
我嘗試過的替代代碼:
JavaScript(在警報中顯示正確的值,但存在與上述相同的行為)
<script type="text/javascript">
function MyFunction() {
if (confirm("Do you want to continue?") == true) {
document.getElementById('<%=HiddenField1.ClientID %>').value = "True";
alert(document.getElementById('<%=HiddenField1.ClientID%>').value);
document.getElementById('form1').submit();
} else {
document.getElementById('<%=HiddenField1.ClientID %>').value = "False";
alert(document.getElementById('<%=HiddenField1.ClientID%>').value);
document.getElementById('form1').submit();
}
}
</script>
aspx
<asp:UpdatePanel ID="UpdatePanelHidden" runat="server">
<ContentTemplate>
<asp:HiddenField ID="HiddenField1" runat="server"/>
</ContentTemplate>
</asp:UpdatePanel>
兩組代碼都產生相同的問題。 我究竟做錯了什么?
解決此問題的最佳方法是在頁面上放置一個平面 jane asp.net 按鈕。
然后,當 js 例程返回 true 時,您可以讓按鈕單擊(服務器端代碼)有條件地運行。
所以,說一些標記,和一個看起來像這樣的按鈕:
這 3 個按鈕是:
<asp:Button ID="cmdSave" runat="server" Text="Save" CssClass="btn" />
<asp:Button ID="cmdCancel" runat="server" Text="Cancel" CssClass="btn" style="margin-left:10px" />
<asp:Button ID="cmdDelete" runat="server" Text="Delete" CssClass="btn" style="margin-left:20px" ClientIDMode="Static"
OnClick="cmdDelete_Click" />
<asp:Button ID="cmdDelete2" runat="server" Text="Delete" CssClass="btn" style="margin-left:20px" ClientIDMode="Static"
OnClientClick="return confirm('Delete this reocrd');" OnClick="cmdDelete2_Click"
/>
注意客戶端點擊事件。 如果 js 代碼返回 false,則 stub 后面的代碼不會運行。
這表明如果您可以檢查客戶端,然后讓您的 js 代碼返回 true 或 false,那么這將控制后面的服務器端代碼是否運行。
現在,如果您必須運行服務器端按鈕代碼,然后進行確認? 這比較困難,但建議您需要有兩個按鈕。 第一個按鈕單擊,服務器端代碼運行,檢查條件,然后在 js 中彈出一個確認對話框 - 如果他們接受是,那么第二個按鈕代碼可以/將觸發。
(因此,可以隱藏第二個按鈕,樣式=顯示:無)。
因此,在上面,我們將添加第二個刪除按鈕
因此,單擊第一個按鈕,此代碼可能會運行:
所以,我們現在有這個:
因此,這兩個按鈕的代碼是這樣的:
protected void cmdDelete_Click(object sender, EventArgs e)
{
// do whatever checking you like, then
// prompt user
string strJs = "$('#cmdDelete2').click();";
Page.ClientScript.RegisterStartupScript(this.GetType(), "myprompt", strJs, true);
}
protected void cmdDelete2_Click(object sender, EventArgs e)
{
Debug.Print("delete code will run");
}
所以,如果可能的話,我會嘗試在客戶端進行測試——這樣我們只需要一個按鈕。
但是,如上所示,用戶單擊第一個刪除按鈕。 我們現在可以運行代碼來遛狗——做任何事情,然后有條件地彈出一個對話框。 該對話框將單擊第二個按鈕,如果用戶點擊確定確認,則代碼將繼續在該第二個例程中運行。
如前所述,如果您可以在第一次單擊按鈕時進行測試,則讓其在客戶端單擊返回 true 或 false,然后將有條件地運行該服務器端代碼。
但是,如果您不能進行客戶端測試,那么我們需要 + 使用上面的兩個按鈕,並且如上所述,我們可以使用 style=display:none 隱藏第二個按鈕。
我能夠弄清楚這一點。 回顧一下,我一直在尋找一種方法來單擊一個按鈕,該按鈕將運行一些服務器端處理,然后切換到客戶端腳本,然后切換回服務器端以完成處理,只需單擊一個按鈕即可。 這是我的做法:
javascript
<script type="text/javascript">
function MyFunction() {
if (confirm("Do you want to continue?") == true) {
document.getElementById('<%=HiddenTextBox1.ClientID %>').value = "True";
__doPostBack("<%=UpdatePanel1.UniqueID %>", "");
} else {
document.getElementById('<%=HiddenTextBox1.ClientID %>').value = "False";
__doPostBack("<%=UpdatePanel1.UniqueID %>", "");
}
}
</script>
在 aspx 下面,我使用了隱藏的 TextBox 而不是 HiddenField,因為當通過 RegisterStartupScript 調用 JavaScript 時,它沒有保留 AutoPostBack 之后的值。
aspx
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="HiddenTextBox1" runat="server" style="display:none;"></asp:TextBox>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
在cs中,我在Button1_Click事件處理程序之后進行了一些處理。 在我准備好調用 JavaScript 時,我使用了 RegisterStartupScript。
CS
Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "MyFunction()", true);
然后我可以使用來自 JavaScript 的輸入,並通過在 Page_Load 中使用以下內容來完成服務器端的處理。
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
if (HiddenTextBox1.Text == "True")
{
Process();
}
else
{
// Do nothing
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.