ScriptManager不在Mono下加载javascript方法

时间:2013-03-07 22:59:56

标签: javascript asp.net apache mono

我一直试图解决这个问题,我正在使用asp.net ScriptManager.RegisterStartupScript()。

代码行如下 -

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

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

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

我尝试过的事情 -

  1. 带有IIS的Windows Server - 运行良好
  2. 在调用ScriptManager之前立即输出一些Web文本 - 原理
  3. 在调用“initGame()”方法的按钮中编码 - 正常工作
  4. 将javascript直接放入RegisterStartupScript调用中 - 不起作用
  5. 在页面中放置javascript - 正常工作
  6. 对我而言,似乎ScriptManager行存在问题,或者是微不足道的事情,或者我需要做的事情/改变它以便在Mono下运行。如果您想查看一下,网址为www.zephyrisgames.net/zephyrisgalaxies/Main.aspx

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

2 个答案:

答案 0 :(得分: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);
 }

答案 1 :(得分:0)

我遇到了同样的问题。 &#34; ScriptManager.RegisterStartupScript&#34;如果在异步后回传(ASP.NET 2.0,Ubuntu Server 13.10)中不起作用。 如果首次加载页面,它的效果很好。

在挖掘Mono来源之后 https://github.com/mono/mono/blob/master/mcs/class/System.Web.Extensions/System.Web.UI/ScriptManager.cs 我看到有一些预编译器的东西,脚本被添加到最终输出:

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;
}

也许有人忘了定义&#34; NET_3_5&#34;这部分不起作用。 另外在初始页面加载&#34; ScriptManager.RegisterStartupScript&#34;实际上调用&#34; ClientScript.RegisterStartupScript&#34; (这就是它在那种情况下起作用的原因)。

我的解决方案是使用&#34; ScriptManager.RegisterClientScriptBlock&#34;模拟行为。 (按预期工作):

/// <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);
  }
}