簡體   English   中英

檢索 HiddenField 服務器端

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM