1

我一直在努力解决我在使用 asp.net ScriptManager.RegisterStartupScript() 时遇到的这个问题。

代码行如下 -

string script = string.Format("initGame('{0}','{1}');", var1, var2);

ScriptManager.RegisterStartupScript(Page, typeof(Page), "mainGameScript", script, true);

该页面托管在运行 apache 2 和 mono 的 Ubuntu 机器上。无论我在 RegisterStartupScript 中写什么都行不通。

我尝试过的事情 -

  1. 带有 IIS 的 Windows Server - 完美运行
  2. 在调用 ScriptManager 之前立即输出一些 Web 文本 - 有效
  3. 在调用“initGame()”方法的按钮中编码 - 有效
  4. 将 javascript 直接放入 RegisterStartupScript 调用中 - 不起作用
  5. 将javascript放在页面中 - 有效

对我来说,ScriptManager 行似乎存在问题,要么是微不足道的,要么是我需要做/更改以使其在 Mono 下运行的事情。如果你想看看,网址是www.zephyrisgames.net/zephyrisgalaxies/Main.aspx

谢谢,如果您需要更多信息,请告诉我,我会尽力制作它。

4

2 回答 2

1

在对此一头雾水之后,我越来越确信 ScriptManager 存在问题。我什至从 repos 中安装了 Mono 3.07,但仍然没有解决任何问题。

解决它的方法是将 ScriptManager 替换为 ClientScript 类。该方法保持不变,尽管 ClientScript 类下的 RegisterStartupScript() 没有添加脚本标签的选项。

一个简单的补救措施如下 -

string tagStart = "<script type=\"text/javascript\">";
string tagEnd = "</script>";
string script = string.Format("initGame('{0}','{1}');", var1, var2);

script = tagStart + script + tagEnd;

if (!Page.ClientScript.IsStartupScriptRegistered("mainGameScript"))
{
     //ScriptManager.RegisterStartupScript(Page, typeof(Page), "mainGameScript", script, true);
     // Left in for historical purpose

    ClientScript.RegisterStartupScript(typeof(Page), "mainGameScript", script);
 }
于 2013-03-11T01:18:04.883 回答
0

我遇到了同样的问题。如果在异步回发(ASP.NET 2.0、Ubuntu Server 13.10)中,“ScriptManager.RegisterStartupScript”不起作用。如果页面是第一次加载,它会很好地工作。

在浏览了 https://github.com/mono/mono/blob/master/mcs/class/System.Web.Extensions/System.Web.UI/ScriptManager.cs上的 Mono 源代码后, 我看到有一些预将脚本添加到最终输出的编译器内容:

switch (scriptEntry.ScriptType) {
  case RegisteredScriptType.ClientScriptBlock:
    if (scriptEntry.AddScriptTags)
      WriteCallbackOutput(output, scriptBlock, scriptContentNoTags, scriptEntry.Script);
    else
      WriteCallbackOutput(output, scriptBlock, scriptContentWithTags, SerializeScriptBlock(scriptEntry));
    break;
#if NET_3_5
  case RegisteredScriptType.ClientStartupScript:
    if (scriptEntry.AddScriptTags)
      WriteCallbackOutput (output, scriptStartupBlock, scriptContentNoTags, scriptEntry.Script);
    else
      WriteCallbackOutput (output, scriptStartupBlock, scriptContentWithTags, SerializeScriptBlock (scriptEntry));
    break;
#endif
  case RegisteredScriptType.ClientScriptInclude:
    WriteCallbackOutput(output, scriptBlock, scriptPath, scriptEntry.Url);
    break;
  case RegisteredScriptType.OnSubmitStatement:
    WriteCallbackOutput(output, onSubmit, null, scriptEntry.Script);
    break;
}

也许有人忘记定义“NET_3_5”,所以这部分不起作用。此外,在初始页面加载时,“ScriptManager.RegisterStartupScript”实际上调用了“ClientScript.RegisterStartupScript”(这就是它在这种情况下工作的原因)。

我的解决方案是使用“ScriptManager.RegisterClientScriptBlock”模拟行为(按预期工作):

/// <summary>
/// Always adds script tags.
/// </summary>
public static void ScriptManagerRegisterStartupScript(Control control, Type type, string key, string script){
  if (!ScriptManager.GetCurrent(control.Page).IsInAsyncPostBack)
    control.Page.ClientScript.RegisterStartupScript(type, key, script, true);
  else {
    string hName = String.Format("h{0}", Guid.NewGuid().ToString("N"));  // Lazy way to get a unique name
    ScriptManager.RegisterClientScriptBlock(control, type, key,
      "function " + hName + " () {" + 
      "Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(" + hName + ");" +
      script +  // This is why we do not support "addScriptTags==false"
      "}" +
      "Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(" + hName + ");",
      true);
  }
}
于 2014-10-28T10:17:55.713 回答