2013-03-07 2 views
1

Я пытался разглядеть эту проблему, с которой я сталкиваюсь с asp.net ScriptManager.RegisterStartupScript().ScriptManager не загружает метод javascript в Mono

Строки кода следующим образом -

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

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

страница размещается на машине Ubuntu, работает Apache 2 и моно. Все, что я пишу в RegisterStartupScript, не работает.

Вещи, которые я пробовал -

  1. Windows Server с IIS - работает отлично
  2. Вывод некоторых веб-текст непосредственно перед вызовом ScriptManager - работы
  3. Coding в кнопку, которая вызывает «initGame () "метод - работы
  4. Ввод javascript непосредственно в вызов RegisterStartupScript - не работает
  5. Ввод javascript i n страницы - работы

Для меня кажется, что есть проблема со строкой ScriptManager, или что-то тривиальное, или что-то, что мне нужно сделать/изменить для его запуска под Mono. Если вы хотите посмотреть, то URL-адрес: www.zephyrisgames.net/zephyrisgalaxies/Main.aspx

Спасибо, и если вам нужна дополнительная информация, пожалуйста, скажите мне, я постараюсь произвести его.

ответ

1

После расщепления волос над этим я все больше убеждаюсь, что проблема связана с ScriptManager. Я даже установил Mono 3.07 из репозиториев, но все равно это ничего не решило.

Решено было заменить ScriptManager классом ClientScript. Метод остается тем же, хотя RegisterStartupScript() в классе ClientScript не имеет возможности добавлять теги скриптов.

простое средство заключается в следующем -

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

Я столкнулся с той же проблемой. «ScriptManager.RegisterStartupScript» не работает, если в async post-back (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; 
} 

Может быть, кто-то забыл определить «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); 
    } 
} 
Смежные вопросы