【问题标题】:ASP.NET getting a hidden field's value after a partial postbackASP.NET 在部分回发后获取隐藏字段的值
【发布时间】:2011-06-16 22:42:45
【问题描述】:

在我的 ASP.NET 页面中,我有一个更新面板,在 updatepanel_Load 事件中,我有以下代码:

if (!IsPostBack || triggeredRefresh.Value == "1") 
{
   HiddenField hiddenField = new HiddenField();
   hiddenField.ID ="hiddenField1";
   hiddenField.Value = "0";
   placeHolder1.Controls.Add(hiddenField);
} 
else if ( triggeredCheck.Value == "1" )
{
    HiddenField hiddenField = placeHolder1.FindControl("hiddenField1") as HiddenField;
    var x = Convert.ToInt32(hiddenField.Value);
} 

所以基本上我将 hiddenFields 添加到占位符,然后使用客户端脚本设置它们的值,然后尝试在 updatepanel_Load 事件中的异步回发中再次读取这些值。

问题在于 FindControl 返回 null,因为此时 placeholder1.Controls.Count 为 0。为什么是零?我在回发之前添加了隐藏字段。

感谢您的帮助

【问题讨论】:

  • 在初始 updatepanel_Load *
  • 为什么要以编程方式添加 HiddenField?我认为问题在于它字段在生命周期中被创建和销毁,并且视图状态不会为它保留任何价值。此外,如果您要在后面的代码中添加控件,我会在 Init 阶段执行以避免其他视图状态问题。
  • 您是否检查过if 块是否在else if 之前执行?只是想确认triggeredRefreshtriggeredCheck 是否设置正确。
  • Reddy,是的,我已经检查过了,并且 if 块的第一部分总是首先执行.. Layoric 我正在以编程方式添加该字段,因为我实际上是在循环遍历数据库中的行并添加根据数据库中的内容动态隐藏字段...有更好的方法吗?

标签: javascript .net asp.net asynchronous postback


【解决方案1】:

您动态添加的任何控件都将在回发时消失。因此返回页面时它不存在。就像 Layoric 所说的那样,它在页面生命周期中被销毁。我会说如果您可以将隐藏字段内联,因为它是一个隐藏字段,如果您不需要它,那么就不要看它(否则它仍然可以坐在那里)。

请记住,当 ASP.NET 页面“回发”时,它会经历整个页面生命周期。这意味着当页面第一次加载时,它会经历页面预初始化、初始化、加载、预渲染、渲染等。然后当它被回发时,它至少会经历预初始化、初始化和加载(可能还有其他事件) ,我想不起来了)在任何事件被触发之前。

【讨论】:

  • 好的,我不能将隐藏字段内联,因为我正在循环遍历数据库中的行并根据数据库中的内容动态添加隐藏字段...有没有更好的方法这个?
  • 是的,有更好的方法来做到这一点。尝试使用 asp.net 中继器。将您需要放在页面上的任何值推送到实现 ienumerable 并将其与转发器绑定的东西中。转发器的工作原理是为绑定的 ienumerable 中的每个项目复制其 itemtemplate 标记中的所有内容。我建议只使用你想要的值作为“commandargument”来点击任何按钮,然后在你附加到按钮的事件处理程序中检查发送者的命令参数是什么并采取相应的行动。
【解决方案2】:

使用这个HttpContext.Request.Form[hiddenField1.UniqueID]

【讨论】:

    【解决方案3】:

    为什么HttpContext.Request.Form["hiddenField1"] 不起作用?

    【讨论】:

    • 这是我尝试的第一件事.. 但它改变了 Request.Form 中的键,所以它最终成为 Request.Form["ctl00$MainContent$hiddenField1"] .. 我没有不知道如何从服务器端代码中获取“ctl00$MainContent$”字符串,所以我不知道如何做到这一点:s
    • 它将在ClientID 属性中。
    • @Jimmy,如果您将ClientIDMode 定义为Static,它不会生成不同的客户端ID,这将起作用。 See the Documentation
    • 但我无权访问该属性..因为当我想要获取隐藏字段值时,我的代码中没有控件..我最初的问题是 FindControl 返回 null,因此在检查值时无法获取 HiddenField 控件。如果我可以访问控件,我无论如何都可以使用 Value 属性
    • 我也试过了。我用 hiddenField.ClientIDMode = ClientIDMode.Static;但它仍然使用键“ctl00$MainContent$hiddenField1”发布到表单中。我认为是因为它在回发值时使用了“name”属性而不是“id”属性?
    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多