簡體   English   中英

通過 javascript 更改的隱藏字段不會在回發時持續存在

[英]Hidden Field altered through javascript not persisting on postback

我有一個帶有隱藏字段的網絡用戶控件。 當 javascript 事件(單擊)發生時,我試圖在隱藏字段中設置一個值,以便可以在回發時保留該值並記住下一次渲染。 該控件是一個可折疊的面板擴展器,不會導致回發,使用jquery,如果回發發生在頁面的其他地方,它會記住它是展開還是折疊。

問題是 javascript 執行,但實際上並沒有改變隱藏字段中的值。 如果我使用dom資源管理器,隱藏的惡魔仍然設置為默認值,然后當我調試時,在下一次回發中隱藏字段仍然設置為默認值。

我也嘗試過使用久經考驗的真正 getElementById 但沒有成功。

沒有發生 javascript 錯誤。

ASCX代碼:

<input id="hiddenCurrentState" type="hidden" runat="server" />

代碼隱藏:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;

public partial class Controls_SubControls_CollapsiblePanelExtender : System.Web.UI.UserControl
{
    public string HeaderControlId { get; set; }

    public string BodyControlId { get; set; }

    public string CollapseAllControlId { get; set; }

    public string ShowAllControlId { get; set; }

    public CollapsedState DefaultState { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            hiddenCurrentState.Value = DefaultState.ToString();
        }
    }

    protected override void OnPreRender(EventArgs e)
    {
        BuildJQueryScript();
        base.OnPreRender(e);
    }

    private void BuildJQueryScript()
    {
        StringBuilder script = new StringBuilder();

        script.Append("$(document).ready(function(){\n");

        //toggle based on current state
        script.Append("if ($(\"#" + hiddenCurrentState.ClientID + "\").attr(\"value\")==\"Expanded\")\n");
        script.Append("{\n");
        script.Append("$(\"#" + BodyControlId + "\").show();\n");
        script.Append("$(\"#" + hiddenCurrentState.ClientID + "\").val(\"Expanded\");\n");
        script.Append("}\n");
        script.Append("else\n");
        script.Append("{\n");
        script.Append("$(\"#" + BodyControlId + "\").hide();\n");
        script.Append("$(\"#" + hiddenCurrentState.ClientID + "\").val(\"Collapsed\");\n");
        script.Append("}\n");


        //toggle on click
        script.Append("$(\"#" + HeaderControlId + "\").click(function(){\n");
        script.Append("  $(this).next(\"#" + BodyControlId + "\").slideToggle(500)\n");
        script.Append("  return false;\n");
        script.Append("});\n");

        //collapse all
        if (!String.IsNullOrEmpty(CollapseAllControlId))
        {
            script.Append("$(\"#" + CollapseAllControlId + "\").click(function(){\n");
            script.Append("  $(\"#" + BodyControlId + "\").slideUp(500)\n");
            script.Append("  return false;\n");
            script.Append("});\n");
        }

        //show all
        if (!String.IsNullOrEmpty(ShowAllControlId))
        {
            script.Append("$(\"#" + ShowAllControlId + "\").click(function(){\n");
            script.Append("  $(this).hide()\n");
            script.Append("  $(\"#" + BodyControlId + "\").slideDown()\n");
            //script.Append("  $(\".message_list li:gt(4)\").slideDown()\n");
            script.Append("  return false;\n");
            script.Append("});\n");
        }

        script.Append("});\n");

        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CollapsiblePanelScript", script.ToString(), true);
    }
}

public enum CollapsedState
{
    Expanded = 0,
    Collapsed = 1
}

我沒有看到您在客戶端設置隱藏字段的值的位置。 當面板折疊/展開時,我希望在折疊/顯示函數中看到類似以下內容的行來實際更改客戶端上的值。

坍塌:

 script.Append( "   $(\"#" + hiddenCurrentState.ClientID + "\").val(1);\n" );

顯示:

 script.Append( "   $(\"#" + hiddenCurrentState.ClientID + "\").val(0);\n" );

在每次回發時,整個頁面都會再次呈現,客戶端更改的任何值都不會保留。

我建議您將狀態存儲在 cookie 中。 當您使用jQueryCOOKIE庫使這變得輕而易舉。

您是否嘗試過使用<asp:HiddenField>而不是<input>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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