非表示フィールドを持つ 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
}