Avatar billede pnr Nybegynder
04. marts 2010 - 15:25 Der er 7 kommentarer og
1 løsning

Problem med at flytte viewstate i et HttpModules

Jeg har fundet noget kode til et HttpModule som flytter Viewstate fra toppen af siden til bunden af siden.
det sker ved at overskrive Write(byte[] buffer, int offset, int count) fra IHttpModule, men det virker ikke. Jeg har så koblet en debugger på og kan se at koden liver loadet over flere gange i "Write(...)". Hvis det er tilfældet er det jo umuligt at flytte en viewstate i Write.

Koden jeg bruger kan findes her: http://www.csharphelp.com/2007/09/an-httpmodule-that-moves-viewstate-to-the-bottom/
Avatar billede arne_v Ekspert
04. marts 2010 - 16:51 #1
Koden virker kun hvis fra start af view state til end of form er i samme Write.

Ikke speciel god kode.

Jeg ville lade Write samle op i en buffer og så lade Close flytte rundt og skrive det hele til den rigtige stream.
Avatar billede pnr Nybegynder
04. marts 2010 - 17:41 #2
Hej Arne, tak for svar.

Kan du give et eksempel på at samle det op i en buffer?
Avatar billede arne_v Ekspert
04. marts 2010 - 17:50 #3
Ja.

Giv mig et par timer.
Avatar billede arne_v Ekspert
04. marts 2010 - 19:26 #4
using System;
using System.IO;
using System.Web;

public class ViewMoveModule : IHttpModule
{
    public void Init(HttpApplication app)
    {
        app.BeginRequest += OnBeginRequest;
    }
    protected void OnBeginRequest(object sender, EventArgs e)
    {
        HttpResponse resp = ((HttpApplication)sender).Response;
        resp.Filter = new ViewMove(resp.Filter);
    }
    public void Dispose()
    {
    }
}
Avatar billede arne_v Ekspert
04. marts 2010 - 19:26 #5
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

public class ViewMove : Stream
{
    private Stream real;
    private Stream temp;
    public ViewMove(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();
        String html = Encoding.UTF8.GetString(((MemoryStream)temp).ToArray());
        int startix = html.IndexOf(@"<input type=""hidden"" name=""__VIEWSTATE""");
        if(startix > 0)
        {
            int endix = html.IndexOf("/>", startix) + 2;
            string viewstate = html.Substring(startix, endix - startix);
            html = html.Replace(viewstate, "");
            html = html.Replace("</form>", viewstate + "</form>");
        }
        byte[] b = Encoding.UTF8.GetBytes(html);
        real.Write(b, 0, b.Length);
    }
    public override void Flush()
    {
        temp.Flush();
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        temp.Write(buffer, offset, count);
    }
}
Avatar billede pnr Nybegynder
04. marts 2010 - 21:05 #6
Smukt :)
Tusind tak for hjælpen! smid et svar så er der velfortjente point!
Avatar billede arne_v Ekspert
04. marts 2010 - 21:13 #7
svar
Avatar billede arne_v Ekspert
04. marts 2010 - 21:14 #8
Husk og rette tegnsæt, hvis du bruger et andet.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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