2

非表示フィールドを持つ Web ユーザー コントロールがあります。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
}
4

3 に答える 3

7

クライアント側の非表示フィールドの値をどこに設定しているのかわかりません。パネルが折りたたまれたり展開されたりしたときに、実際にクライアントの値を変更するために、collapse/show関数に次のような行が表示されると思います。

崩壊:

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

公演:

 script.Append( "   $(\"#" + hiddenCurrentState.ClientID + "\").val(0);\n" );
于 2009-03-27T13:37:27.850 に答える
0

ポストバックごとにページ全体が再度レンダリングされ、クライアント側で変更された値は保持されません。

状態を Cookie に保存することをお勧めします。を使用しているようjQueryに、COOKIEライブラリを使用すると、これが簡単になります。

于 2009-04-16T04:12:33.673 に答える
0

<asp:HiddenField>の代わりに使用してみました<input>か?

于 2009-04-16T23:03:28.117 に答える