Avatar billede qqq Nybegynder
18. februar 2010 - 16:31 Der er 4 kommentarer og
1 løsning

Finde alle <script> tags og ændre src attribute

Hej,

Er det muligt med .net og C# at loope alle <script> tags i sidens header igennem og ændre deres src attriute?

Jeg kan med nedenstående kode ændre href attributten for alle <link> tags, men jeg kan ikke få det til at virke med <script> tags.

foreach (Control control in Page.Header.Controls)
{
    HtmlControl c = control as HtmlControl;
        if (c != null && c.Attributes["type"] != null && c.Attributes["type"].Equals("text/css", StringComparison.OrdinalIgnoreCase))
          {
            c.Attributes["href"] = "NewhrefValue";
          }
}

Så spørgsmålet går på, hvordan ændrer jeg src attributen for alle <script> tags i sidens header on the fly med .NET/C#?
Avatar billede arne_v Ekspert
20. februar 2010 - 22:13 #1
<script> er vel ikke en ASP.NET kontrol, men helt literal.

D.v.s. at du ikke tilgå den via Controls.

Men du kan gøre det med et HttpModule og et Filter.
Avatar billede arne_v Ekspert
20. februar 2010 - 23:28 #2
Outline af løsning:


using System;
using System.IO;
using System.Web;

public class ScriptReplaceModule : IHttpModule
{
    public void Init(HttpApplication app)
    {
        app.BeginRequest += OnBeginRequest;
    }
    protected void OnBeginRequest(object sender, EventArgs e)
    {
        HttpResponse resp = ((HttpApplication)sender).Response;
        resp.Filter = new ScriptReplace(resp.Filter);
    }
    public void Dispose()
    {
    }
}



using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

public class ScriptReplace : Stream
{
    private Stream real;
    private Stream temp;
    public ScriptReplace(Stream real)
    {
        this.real = real;
        this.temp = new MemoryStream();
    }
    public override bool CanRead
    {
        get
        {
            return false;
        }
    }
    public override bool CanSeek
    {
        get
        {
            return false;
        }
    }
    public override bool CanWrite
    {
        get
        {
            return true;
        }
    }
    public override long Length
    {
        get
        {
            return temp.Length;
        }
    }
    public override long Position
    {
        get
        {
            return temp.Position;
        }
        set
        {
            throw new NotSupportedException();
        }
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
        throw new NotSupportedException();
    }
    public override long Seek(long offset, SeekOrigin direction)
    {
        throw new NotSupportedException();
    }
    public override void SetLength(long length)
    {
        throw new NotSupportedException();
    }
    public override void Close()
    {
        temp.Close();
        StreamReader sr = new StreamReader(new MemoryStream(((MemoryStream)temp).ToArray()), Encoding.UTF8);
        StreamWriter sw = new StreamWriter(real, Encoding.UTF8);
        string line;
        while((line = sr.ReadLine()) != null)
        {
            line = Regex.Replace(line, @"(<script src="")([^""]+)("">)", "$1/js/$2$3");
            sw.WriteLine(line);
        }
        sr.Close();
        sw.Close();
    }
    public override void Flush()
    {
        temp.Flush();
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        temp.Write(buffer, offset, count);
    }
}
Avatar billede arne_v Ekspert
20. februar 2010 - 23:29 #3
Koden kan godt forbedres lidt, men ideen bør fremgår klart.
Avatar billede qqq Nybegynder
26. februar 2010 - 14:31 #4
Hej Arne,

Mange tak for din kommentar og dit eksempel.
Det fik mig på rette vej.

Venligst smid et svar, så jeg kan lukke.
Avatar billede arne_v Ekspert
26. februar 2010 - 14:59 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester