【发布时间】:2009-04-20 23:42:34
【问题描述】:
我有一些设置表单字段的客户端 JavaScript。当页面回发时,这些字段会被重置。
这是为什么?回传发生时,字段值不是被捕获并放入ViewState中吗?
编辑:当我在 Page_Load() 上中断调试器时,在回发后执行任何代码之前,表单字段值为空。
【问题讨论】:
标签: asp.net javascript postback
我有一些设置表单字段的客户端 JavaScript。当页面回发时,这些字段会被重置。
这是为什么?回传发生时,字段值不是被捕获并放入ViewState中吗?
编辑:当我在 Page_Load() 上中断调试器时,在回发后执行任何代码之前,表单字段值为空。
【问题讨论】:
标签: asp.net javascript postback
从您的客户端 javascript 填充的表单元素是否设置为禁用?如果是这样,ASP.NET 将忽略该值。
例如:
<asp:TextBox ID="TextBox1" Enabled="False" Runat="Server" />
<script type="text/javascript">
document.forms[0].elements["TextBox1"].style.disabled = false;
document.forms[0].elements["TextBox1"].value = "Value set from Javascript";
</script>
当这段代码运行时,ASP.NET 认为文本框被禁用,因此在回发中丢弃了它的值,因此 TextBox1.Text 的值将始终为空。据我所知,这种行为适用于所有表单元素。如果 ASP.NET 认为它们被禁用,并且它们随后被启用并填充到客户端,则该值在回发时将不可用。
【讨论】:
是的。听起来您还有其他问题(可能是 OnLoad 处理程序未检查 IsPostback 字段并因此覆盖您更改的值?)。
【讨论】:
检查服务器端正在初始化什么,我见过的最常见的问题是任何服务器端初始化代码都不会像这样检查 IsPackBack:
if (!Page.IsPostBack) {
// Do Work
}
【讨论】:
要检查的另一件事是您是在进行回发还是回调。如果您正在执行回调,则与回调一起返回的表单字段值是页面首先发送给客户端的值。出于某种原因,ASP.NET AJAX 挑选这些值并在每次回调时发送它们,而不是重新读取表单字段。
【讨论】:
这是因为我在字段上设置了enabled="false"。我将字段更改为readonly="true",同样的事情发生了。
解决方案是在运行时使用 JS 将字段更改为只读。
【讨论】: