Wednesday, December 14, 2011

ASP.Net'te bir kontrolü bir stringe render etme

1.) Buna neden ihtiyaç duyulsun ki?
El-Cevap: Diyelim ki sayfanın(.aspx) bir yerine bir Literal koyduk ve belirli bir duruma göre bu literalin içine farklı içerik getiren kod yazıyoruz. Bir string tanımlarız ve içine istediğimiz html içeriği elle yazar yollarız. Hatta çoksatırlı(multiline) olsun, (biraz da artistlik olsun) diye de stringi:


 string HtmlIcerik = @"  
<div>
<p>Merhaba Dünya!</p>
<font color=""red"">Bu içeriği ben sunucuda oluşturdum.</font>
</div>";


şeklinde tanımlarız.
Çok güzel,
Pekâla ama eğer bir asp.net kontrolünü de içeriğe eklemek istersek nasıl yaparız? Direk araya bir yerlere basarız "<asp:Button .. vd." kodumuzu, değil mi? Ama bu string'in render edilmiş hali ne olur sizce? Tabii ki stringin içindeki button render edilmeden gönderildiği için, literalinizin içinde anlamsız bir "<asp:Button .. vd." html tagı bulunacaktır. İşte buna benzer bir durumu kotarmak için ihtiyaç duyarız.


2.) Peki nasıl yapılıyor?
El-Cevap: Aslında çok basit. Sayfayı derlerken yapılacak olan Asp.Net Control Rendering'ini elle yaptırıyoruz.
Eğer tek bir kontrolü render ettireceksek:
 //BenimKontolum Control'den türemiş herhangi birşey  
var newContent = string.Empty;
using (var stringWriter = new StringWriter())
using (var htmlWriter = new HtmlTextWriter(stringWriter))
{
    BenimKontrolum.RenderControl(htmlWriter);
newContent = stringWriter.ToString();
}
return newContent;


Kompleks bir kontrolü(yani içinde kontroller olan bir kontrolü render ettireceksek:
 var newContent = string.Empty;   
using (var stringWriter = new StringWriter())
using (var htmlWriter = new HtmlTextWriter(stringWriter))
{
foreach (var control in controls)
{
control.RenderControl(htmlWriter);
}
newContent = stringWriter.ToString();
}

No comments:

Post a Comment