Не может получить ScriptManager. RegisterStartupScript в WebControl, вложенном в UpdatePanel для работы

Вот полный пример:

Сохраните его как Sample.java

и скомпилируйте его: javac Sample.java

запустите его с: java Sample "in.txt" "out.txt"

[ 118] или: java Sample

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Sample {
    public static void main(String[] args) throws IOException {
        if(args.length == 2)
        {
            doFileStuff(args[0],args[1]);
        }
        else {
            doFileStuff("in.txt","out.txt");
        }
    }

    public static void doFileStuff(String input_filename, String output_filename) throws IOException {

        if(!Files.exists(Paths.get(input_filename)))
        {
            System.err.println("file not exist: " + input_filename);
            return;
        }

        if(!Files.exists(Paths.get(output_filename)))
        {
            System.err.println("file still exist, do not overwrite it: " + output_filename);
            return;
        }

        String content = new String(Files.readAllBytes(Paths.get(input_filename)));

        content += "\nHas added something";

        Files.write(Paths.get(output_filename), content.getBytes(StandardCharsets.UTF_8));
    }
}
33
задан Kev 11 March 2012 в 13:23
поделиться

7 ответов

I think you should indeed be using the Control overload of the RegisterStartupScript.

I've tried the following code in a server control:

[ToolboxData("<{0}:AlertControl runat=server></{0}:AlertControl>")]
public class AlertControl : Control{
    protected override void OnInit(EventArgs e){
        base.OnInit(e);
        string script = "alert(\"Hello!\");";
        ScriptManager.RegisterStartupScript(this, GetType(), 
                      "ServerControlScript", script, true);
    }
}

Then in my page I have:

protected override void OnInit(EventArgs e){
    base.OnInit(e);
    Placeholder1.Controls.Add(new AlertControl());
}

Where Placeholder1 is a placeholder in an update panel. The placeholder has a couple of other controls on in it, including buttons.

This behaved exactly as you would expect, I got an alert saying "Hello" every time I loaded the page or caused the update panel to update.

The other thing you could look at is to hook into some of the page lifecycle events that are fired during an update panel request:

Sys.WebForms.PageRequestManager.getInstance()
   .add_endRequest(EndRequestHandler);

The PageRequestManager endRequestHandler event fires every time an update panel completes its update - this would allow you to call a method to set up your control.

My only other questions are:

  • What is your script actually doing?
  • Presumably you can see the script in the HTML at the bottom of the page (just before the closing tag)?
  • Have you tried putting a few "alert("Here");" calls in your startup script to see if it's being called correctly?
  • Have you tried Firefox and Firebug - is that reporting any script errors?
15
ответ дан 27 November 2019 в 18:12
поделиться

When you call ScriptManager.RegisterStartupScript, the "Control" parameter must be a control that is within an UpdatePanel that will be updated. You need to change it to:

ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), script, true);
10
ответ дан 27 November 2019 в 18:12
поделиться

Решение состоит в том, чтобы поместить сценарии во внешний файл js (например, под названием 'yourDynamic.js') и перерегистрировать. Файл каждый раз, когда вы обновляете панель обновления.

Я использую это в событии updatepanel_prerender:

ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "UpdatePanel1_PreRender", _
                   "<script type='text/javascript' id='UpdatePanel1_PreRender'>" & _
                   "include('yourDynamic.js');" & _
                   "removeDuplicatedScript('UpdatePanel1_PreRender');</script>" _
                   , False)

На странице или в некоторых других включениях вам понадобится этот javascript:

// Include a javascript file inside another one.
function include(filename)
{
    var head = document.getElementsByTagName('head')[0];

    var scripts = document.getElementsByTagName('script');
    for(var x=0;x<scripts.length;>    {
        if (scripts[x].getAttribute('src'))
        {
            if(scripts[x].getAttribute('src').indexOf(filename) != -1)
            {
                head.removeChild(scripts[x]);
                break;
            }
        }
    }

    script = document.createElement('script');
    script.src = filename;
    script.type = 'text/javascript';
    head.appendChild(script)
}

// Removes duplicated scripts.
function removeDuplicatedScript(id)
{
    var count = 0;
    var head = document.getElementsByTagName('head')[0];

    var scripts = document.getElementsByTagName('script');
    var firstScript;
    for(var x=0;x<scripts.length;>    {
        if (scripts[x].getAttribute('id'))
        {
            if(scripts[x].getAttribute('id').indexOf(id) != -1)
            {
                if (count == 0)
                {
                    firstScript = scripts[x];
                    count++;
                }
                else
                {
                    head.removeChild(firstScript);
                    firstScript = scripts[x];
                    count = 1;
                }
            }
        }
    }
    clearAjaxNetJunk();
}
// Evoids the update panel auto generated scripts to grow to inifity. X-(
function clearAjaxNetJunk()
{
    var knowJunk = 'Sys.Application.add_init(function() {';
    var count = 0;
    var head = document.getElementsByTagName('head')[0];

    var scripts = document.getElementsByTagName('script');
    var firstScript;
    for(var x=0;x<scripts.length;>    {
        if (scripts[x].textContent)
        {
            if(scripts[x].textContent.indexOf(knowJunk) != -1)
            {
                if (count == 0)
                {
                    firstScript = scripts[x];
                    count++;
                }
                else
                {
                    head.removeChild(firstScript);
                    firstScript = scripts[x];
                    count = 1;
                }
            }
        }
    }
}

Довольно круто, ах ... jejeje Эта часть того, что я опубликовал некоторое время назад здесь .

Надеюсь, что это поможет ...:)

1
ответ дан 27 November 2019 в 18:12
поделиться

У меня возникла проблема с Page.ClientScript.RegisterStartUpScript - я не использовал панель обновления, но элемент управления был кэширован. Это означало, что я должен был вставить скрипт в Literal (или мог использовать PlaceHolder), чтобы при рендеринге из кэша скрипт включался.

Подобное решение может работать для вас.

1
ответ дан 27 November 2019 в 18:12
поделиться

Я пробовал многое и наконец обнаружил, что последний параметр должен быть ложным, и вы должны добавить тег