我一直试图解决这个问题,我正在使用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中写什么都行不通。
我尝试过的事情 -
对我而言,似乎ScriptManager行存在问题,或者是微不足道的事情,或者我需要做的事情/改变它以便在Mono下运行。如果您想查看一下,网址为www.zephyrisgames.net/zephyrisgalaxies/Main.aspx
谢谢,如果您需要更多信息,请告诉我,我会尝试制作它。
答案 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);
}
}