• Forum vBulletin altyapısından Xenforo altyapısına geçirildi, bu sebeple eski şifreleriniz ile foruma giriş yapamayacaksınız, parolamı unuttum adımından mailiniz ile şifre sıfırlayarak giriş yapabilirsiniz.

    Üyeliklerinde geçerli bir mail adresi olmadığı için sıfırlama yapamayacak kullanıcılar forum kullanıcı adlarını ve yeni şifrelerini yazarak info@maxigame.org adresine şifre sıfırlamak istediklerine dair bir mail göndersinler şifrelerini sıfırlayıp mail adreslerini güncelleyeceğiz. Şifreniz sıfırlandıktan sonra foruma giriş yapıp tekrar istediğiniz gibi değiştirebilirsiniz.

Bir ASP.NET Sayfasının HTML Çıktısını Değiştirmek

CottonCandy

Atlas Evren
Aileden
Aktiflik
K.Tarihi
26 Tem 2009
Mesajlar
1,087
Puanı
472
Konum
M.K.ATATÜRK
QRGOZj.jpg



Bir web sayfasının HTML çıktısını bazı özel durumlarda programatik olarak elde etmek veya değiştirmek isteyebiliriz. ASP.NET'in sayfa yapısı ve HTML oluşturma şekili ilk bakışta biraz karmaşık görünse de, gelişmiş özellikleri sayesinde bir web sayfasına ait HTML çıktıyı programatik olarak ele almamıza ve değiştirmemize olanak sağlamaktadır. Peki neden HTML çıktıyı değiştirmek isteyelim?



ASP.NET uygulamalarında, bir sayfanın HTML çıktısına Response.Filter özelliği ile erişebiliriz. Bu özellik System.IO.Stream tipinden bir değer döndürmektedir. Her ne kadar Response.Filter gibi yazımı çok kolay olan bir yolla HTML çıktıya erişiyor gibi görünse de, bu çıktıya erişmek, hatta çıktıyı değiştirmek için biraz daha zahmetli bir yol izlememiz gerekecektir.
Stream nesnesi ile dosya okuma tecrübesi olanlar ne demek istediğimi daha iyi
anlayacaktır. Örneğimize başlamadan önce basit bir sayfa tasarlayıp oluşturacağı
HTML çıktıyı inceleyelim. Aşağıda örnek sayfamızın kodları yer almaktadır.



Default.aspx

HTML:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Mail adresim:<br>
        info@cottoncandy
    </div>
    </form>
</body>
</html>

Sayfa üzerinde dinamik olarak bir işlem yapmadığımız için <div>
elementinin iç kısmı oluşacak HTML çıktıda aynen yer alacaktır. Sayfadaki
amacımız <br> şeklinde yazılmış elementleri <br /> şekline getirmek ve
içerisinde info@cottoncandy gibi @
işareti ile yazılmış mail adreslerini sayfamızı indeksleyen örümcek
yazılımlardan koruma için testmaili (at) maxigamerz.com şekline getirmek olacak

Çıktıyı değiştirmeden önce çıktıyı nasıl elde edip,
string bir değişkene atabileceğimize bakalım. Response.Filter özelliği Stream
tipinden bir nesne taşımaktadır. Bu nesnenin içeriğini elde edebilmek için özel
bir Stream nesnesi yazmak ve Response.Filter'ın içeriğini bu nesne üzerinden
istemciye gitmesini sağlamamız gerekir. Dolayısıyla ilk olarak Filter özelliğine
atayabileceğimiz tipten, yani Stream sınıfından kalıtılmış bir sınıf yazacağız. Aşağıda
HtmlFilterStream adındaki özel sınıfımıza ait kodlar
yer almaktadır. Kodlar kalabalık görünse de, makalenin ilerleyen kısımlarında
sadece Flush ve Write metotlarının içeriklerinde değişiklikler yapacağız.

App_Code/HtmlFilterStream.cs


HTML:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
public class HtmlFilterStream : Stream
{
    Stream _baseStream;
    long _position;
    string _html = "";

HTML:
public HtmlFilterStream(Stream stream)
    {
        _baseStream = stream;
    }
    public override bool CanRead { get { return true; } }
    public override bool CanSeek { get { return true; } }
    public override bool CanWrite { get { return true; } }
    public override long Length { get { return 0; } }
    public override long Position
    {
        get { return _position; }
        set { _position = value; }
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        _baseStream.Write(buffer, 0, buffer.Length);
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
        return _baseStream.Read(buffer, offset, count);
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
        return _baseStream.Seek(offset, origin);
    }
    public override void SetLength(long value)
    {
        _baseStream.SetLength(value);
    }
    public override void Flush()
    {
        _baseStream.Flush();
    }
}
Sınıfımızı Stream sınıfından kalıttığımız için Flush, Length, Read, Write
gibi abstract üyeleri ezmemiz(override) gerekiyor. Üyelerin içlerini yukarıdaki
kodlarda görüldüğü şekilde dolduruyoruz. Response.Filter özelliğinden alacağımız
nesnenin kendine ait üyeleri
çağırabilmek içinse _baseStream adından bir field tanımlıyor ve
sınıfın yapıcı metodunda(constructor) bu nesneyi parametre olarak alıyoruz. Bir
de _html adında bir field tanımlamamız var, bu field az sonra okuma işlemlerinde
kullanmamız için gerekli olacak.

Gelelim HTML çıktıyı yakalama işlemine. İlk olarak sadece çıktıyı okumaya
çalışacağız. ASP.NET sayfalarının çıktıları oluşurken sayfa parçalar halinde
render edilmekte ve Write metodu çalışma zamanı içerisinde birden fazla defa
tetiklenebilmektedir. Her tetiklenmede HTML çıktının belirli bir parçası elde
edildiği için bu metotta HTML kodlarının parçalarını birleştirmemiz gerekecek.
Flush metodu ise açılan stream'e ait bilgilerin bellekten kaldırılmasından hemen
önce tetikleneceği için bu metotta elde edilen HTML kodlarını tamamına
erişebileceğiz. Write ve Flush metotlarında yapacağımız değişiklikler aşağıda
görülmektedir.


HTML:
public class HtmlFilterStream:Stream
{
    ...
    public override void Write(byte[] buffer, int offset, int count)
    {
        _html += Encoding.Default.GetString(buffer, offset, count);
        _baseStream.Write(buffer, 0, buffer.Length);
    }
    ...
    public override void Flush()
    {
        string output = _html;
        _baseStream.Flush();
    }
}

Write metodunda üretilen HTML çıktıları birleştirdik ve son olarak Flush
metodunda
tüm çıktıyı okuduk. Eğer çıktıyı belirli bir kaynağa kaydetmek
istersek Flush metodu içerisinde _html değişkeninin içeriğini kullanabiliriz.
Çıktıyı yakalamak için gerekli kodları hazırladık, ancak halâ ASP.NET sayfamızın
HTML çıktısını bu nesne üzerinden stream edilmesini sağlamış değiliz. Bu işlemi
gerçekleştirmek için de Default.aspx dosyasının Page_Load metoduna aşağıdaki
satırı eklememiz yeterli.


HTML:
public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Filter = new HtmlFilterStream(Response.Filter);
    }
}


asp.net ile ilgili Gerekli Kodlar Burdan Paylaşacağım Rehber Olarak
 
Geri
Üst