Скрытое поле, измененное через JavaScript, не сохраняется при обратной передаче - PullRequest
2 голосов
/ 27 марта 2009

У меня есть пользовательский веб-элемент управления со скрытым полем. Когда происходит событие javascript (щелчок), я пытаюсь установить значение в скрытом поле, чтобы его можно было сохранить при обратной передаче и запомнить для следующего рендеринга. Элемент управления представляет собой разборный расширитель панели, который не вызывает обратную передачу, использует jquery и, если обратная передача происходит в другом месте на странице, он запоминает, развернут ли он или свернут.

Проблема в том, что javascript выполняется, но фактически не изменяет значение в скрытом поле. Если я использую dom explorer, для скрытого демона по-прежнему будет установлено значение по умолчанию, а затем при отладке в следующем постбеке скрытое поле также будет по умолчанию.

Я также пытался использовать опробованный и истинный getElementById, но безуспешно.

Нет ошибок JavaScript.

ASCX код:

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

Codebehind:

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   }

Ответы [ 3 ]

7 голосов
/ 27 марта 2009

Я не вижу, где вы устанавливаете значение скрытого поля на стороне клиента. Я ожидаю увидеть строку, подобную следующей, в ваших функциях свернуть / показать, чтобы фактически изменить значение на клиенте, когда панель свернута / развернута.

Collapse:

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

Показать:

 script.Append( "   $(\"#" + hiddenCurrentState.ClientID + "\").val(0);\n" );
0 голосов
/ 17 апреля 2009

Вы пытались использовать <asp:HiddenField> вместо <input>?

0 голосов
/ 16 апреля 2009

При каждом обратном сообщении вся страница отображается снова, любые значения, измененные на стороне клиента, не будут сохранены.

Я рекомендую вам сохранить состояние в файле cookie. Поскольку вы используете jQuery, библиотека COOKIE делает это легким делом.

...