【问题标题】:How do you extract all the javascript code from a user control in code behind您如何在代码后面的用户控件中提取所有 javascript 代码
【发布时间】:2012-03-09 03:51:55
【问题描述】:

在我页面的 PreRender 事件中,我决定执行response.redirect()。 这意味着该页面上 <script language="JavaScript" type="text/javascript"> 标记中包含的任何 javascript 都不会被执行。

我希望做到以下几点:

String allJavaScript = MagicFunctionThatReturnsAllJSInTheControl(someUserControl)

ClientScript.RegisterClientScriptBlock("".GetType(), "s", allJavaScript );

Response.Redirect("~/newpage.aspx",false);

你知道如何编写一个代码,在 C#/vb.net 中MagicFunctionThatReturnsAllJSInTheControl(someUserControl)

谢谢

【问题讨论】:

  • RegisterClientScriptBlock() 只渲染当前页面中的<script> 元素,不再渲染。所以即使你希望的事情是可能的,你仍然必须以某种方式将allJavascript 传递给newpage.aspx 以使该页面执行它。由于您正在重定向,因此您必须使用查询字符串或用户的会话。结果可能不会很漂亮。
  • 并非如此,ClientScript.RegisterClientScriptBlock 会在浏览器重定向到 newpage.aspx 之前在 currentpage.aspx 上执行它
  • 嗯,不。 RegisterClientScriptBlock() 将安排一个<script> 元素在当前页面中呈现,然后Response.Redirect() 将继续忘记整个页面并向客户端发送一个302 标头。也许你在考虑Server.Transfer()
  • @trainer 脚本在响应结束时运行,因此如果您正在执行response.redirect,则不会处理当前响应的脚本...
  • @Frédéric Hamidi => 一旦控件从函数中移出,甚至在页面生命周期之后,并且在没有像其他用户提到的那样移动到另一个页面的情况下,您提到的脚本代码应该执行response.redirect。如果在同一个函数中移动到其他页面,在即将过期的页面上渲染脚本标签是否有意义...?

标签: javascript asp.net extract code-behind


【解决方案1】:

根据您的最后评论,我认为我有一个可能的解决方案,即使它没有像最初所说的那样回答您的问题。

因此,您希望currentpage.aspx 中的脚本在客户端上执行,即使您正在将其重定向到newpage.aspx。这种情况下可以避开Response.Redirect(),在客户端进行重定向:

string redirectScript = String.Format(CultureInfo.InvariantCulture,
    "window.location.href = '{0}';", ResolveUrl("~/newpage.aspx"));

ClientScript.RegisterClientScriptBlock(GetType(), "redirectScript",
    redirectScript, true);

这样,客户端应该加载页面并执行其中的脚本,然后加载newpage.aspx。如果您可以在重定向页面加载时让原始页面短暂可见,这可能会解决您的问题。

【讨论】:

  • 这可能无法正常工作。 According to MSDN:“脚本块不保证按照注册的顺序输出”。如果首先输出第二个脚本,重定向将立即发生,其他脚本将永远不会执行。
  • @gilly3,如果提问者可以直接执行它们,我认为发问者实际上并不想使用属于标记一部分的脚本调用RegisterClientScriptBlock()(您的答案中的代码实际上最终会呈现这些脚本两次,假设MagicFunctionThatReturnsAllJSInTheControl() 的行为符合预期)。但是,作为标记一部分的脚本将始终在通过RegisterClientScriptBlock() 注册的脚本之前运行,因此使用它进行重定向应该是安全的。但是,如果代码中还有其他对 RegisterClientScriptBlock() 的调用,那么您的观点就成立了。
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多