我有一个带有隐藏字段的Web用户控件。当javascript事件(单击)出现错误时,我试图在隐藏字段中设置一个值,以便可以在回发时保留该值并记住下一次渲染。该控件是一个可折叠的面板扩展器,不会导致回发,使用jquery,如果回发发生在页面的其他位置,它会记住它是展开还是折叠。
问题是javascript执行,但实际上并没有更改隐藏字段中的值。如果我使用dom explorer,隐藏的恶魔仍然设置为默认值,然后当我调试时,在下一个回发中隐藏字段仍然设置为默认值。
我也尝试使用经过验证的真实getElementById但没有成功。
不会发生javascript错误。
ASCX代码:
<input id="hiddenCurrentState" type="hidden" runat="server" />
代码隐藏:
1 using System;
2 using System.Web;
3 using System.Web.UI;
4 using System.Web.UI.WebControls;
5 using System.Text;
6
7 public partial class Controls_SubControls_CollapsiblePanelExtender : System.Web.UI.UserControl
8 {
9 public string HeaderControlId { get; set; }
10
11 public string BodyControlId { get; set; }
12
13 public string CollapseAllControlId { get; set; }
14
15 public string ShowAllControlId { get; set; }
16
17 public CollapsedState DefaultState { get; set; }
18
19 protected void Page_Load(object sender, EventArgs e)
20 {
21 if (!IsPostBack)
22 {
23 hiddenCurrentState.Value = DefaultState.ToString();
24 }
25 }
26
27 protected override void OnPreRender(EventArgs e)
28 {
29 BuildJQueryScript();
30 base.OnPreRender(e);
31 }
32
33 private void BuildJQueryScript()
34 {
35 StringBuilder script = new StringBuilder();
36
37 script.Append("$(document).ready(function(){\n");
38
39 //toggle based on current state
40 script.Append("if ($(\"#" + hiddenCurrentState.ClientID + "\").attr(\"value\")==\"Expanded\")\n");
41 script.Append("{\n");
42 script.Append("$(\"#" + BodyControlId + "\").show();\n");
43 script.Append("$(\"#" + hiddenCurrentState.ClientID + "\").val(\"Expanded\");\n");
44 script.Append("}\n");
45 script.Append("else\n");
46 script.Append("{\n");
47 script.Append("$(\"#" + BodyControlId + "\").hide();\n");
48 script.Append("$(\"#" + hiddenCurrentState.ClientID + "\").val(\"Collapsed\");\n");
49 script.Append("}\n");
50
51
52 //toggle on click
53 script.Append("$(\"#" + HeaderControlId + "\").click(function(){\n");
54 script.Append(" $(this).next(\"#" + BodyControlId + "\").slideToggle(500)\n");
55 script.Append(" return false;\n");
56 script.Append("});\n");
57
58 //collapse all
59 if (!String.IsNullOrEmpty(CollapseAllControlId))
60 {
61 script.Append("$(\"#" + CollapseAllControlId + "\").click(function(){\n");
62 script.Append(" $(\"#" + BodyControlId + "\").slideUp(500)\n");
63 script.Append(" return false;\n");
64 script.Append("});\n");
65 }
66
67 //show all
68 if (!String.IsNullOrEmpty(ShowAllControlId))
69 {
70 script.Append("$(\"#" + ShowAllControlId + "\").click(function(){\n");
71 script.Append(" $(this).hide()\n");
72 script.Append(" $(\"#" + BodyControlId + "\").slideDown()\n");
73 //script.Append(" $(\".message_list li:gt(4)\").slideDown()\n");
74 script.Append(" return false;\n");
75 script.Append("});\n");
76 }
77
78 script.Append("});\n");
79
80 Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CollapsiblePanelScript", script.ToString(), true);
81 }
82 }
83
84 public enum CollapsedState
85 {
86 Expanded = 0,
87 Collapsed = 1
88 }
答案 0 :(得分:7)
我看不到您在客户端设置隐藏字段的值的位置。我希望在折叠/展示函数中看到类似下面的行,以便在折叠/展开面板时实际更改客户端上的值。
崩溃:
script.Append( " $(\"#" + hiddenCurrentState.ClientID + "\").val(1);\n" );
显示:
script.Append( " $(\"#" + hiddenCurrentState.ClientID + "\").val(0);\n" );
答案 1 :(得分:0)
在每个帖子上,整个页面再次呈现,客户端上更改的任何值都不会保留。
我建议您将状态存储在cookie中。当您使用jQuery
时,COOKIE库使这个变得简单。
答案 2 :(得分:0)
您是否尝试过使用<asp:HiddenField>
代替<input>
?