0

我在添加到代码隐藏中的一些 javascript 时遇到问题。我在这里试图实现的目标是在页面加载上进行另一个回发。现在,你可能会觉得这很奇怪,但我的疯狂是有办法的。

在我的 ASP.Net 向导中,我有一个文本框,其中包含从另一个步骤填充的日期。然后,该日期用于用财务信息填充 3 个其他控件。有必要在此步骤的负载上填充这 3 个其他控件。现在我试图简单地做 on page_load,但这不起作用,因为某些控件不存在或日期不在文本框中。我也尝试在该page render方法上执行此操作,但出于相同的原因,这也不起作用。

因此,我求助于使用 javascript 执行双重回发,但这会导致各种问题。

这是 Page_Load 的代码:

 Dim validateFinancial as String = "<script language='javascript'>window.onload = function() ( ValidateFinancialDate() { __doPostBack('<%= UpdatePanel2.ClientID %>'); return false; })</script>"
 Page.ClientScript.RegisterStartUp(Me.GetType(), "MyScript", validateFinancial, false)

它没有触发,并且在浏览器左下角的 javascript 错误框中显示缺少“;”。如果我删除 javascript 代码并简单地将其添加到带有字符串中函数名称的标记中,它将出现错误,但是当发布到网络服务器时会导致 AJAX 控件在整个页面上失败。

请问有没有办法让这个工作?

4

2 回答 2

2

你的问题是

<%= UpdatePanel2.ClientID %>

不会被解释。当您希望您的 javascript 回发时,ASP 已经完成了您的页面的呈现。您将不得不找到另一种传递 UpdatePanel2.ClientID 值的方法。

于 2013-01-18T12:25:30.853 回答
1

你不应该<%= UpdatePanel2.ClientID %>在后端使用。使用将您的替换为上述方法的返回值来获得__doPostBack('<%= UpdatePanel2.ClientID %>')等效项。ClientScript.GetPostBackEventReference(UpdatePanel2, string.Empty);__doPostBack('<%= UpdatePanel2.ClientID %>')


更详细:

让我们从头开始。在客户端加载页面后,您需要由 UpdatePanel2 启动回发。正确的 JS 函数模式应该是:

window.onload = function() { ValidateFinancialDate(); %Do postback%; return false;};

要获得 UpdatePanel2 的 %Do postback% 函数调用,我们需要使用ClientScript.GetPostBackEventReference(UpdatePanel2, string.Empty)backend 方法,该方法将产生正确的 JS __doPostBack 函数调用,以发出由 UpdatePanel2 控件发起的回发请求。

因此 C# 上的工作示例如下:

string postbackReference = Page.ClientScript.GetPostBackEventReference(UpdatePanel2, string.Empty);
string validateFinancial = "window.onload = function() { ValidateFinancialDate(); " + postbackReference + "; return false;};";
Page.ClientScript.RegisterStartUp(this.GetType(), "MyScript", validateFinancial, true);

请注意 RegisterStartUp 方法的true参数,这将自动将 validateFinancial 脚本内容包装到标签中。

但是对于您要解决的问题,这种双重回发的解决方法似乎是人为的,如果您提供更多源代码,我们可以找到更好的解决方案。

于 2013-01-18T12:30:52.907 回答