2009-03-15 25 views
9

Web projemin iş öğesi editörü sayfasında, bir nesne ekledikten veya güncelledikten sonra yöneticiye bir bildirim e-postası gönderiyorum. Ancak, düz bir metin postası göndermek yerine, sadece bu amaç için hazırlanmış başka bir aspx sayfasının (Notification.aspx) html çıktısını göndermek istiyorum.başka bir sayfada bir aspx sayfası görüntüleniyor

İlk olarak, bir örnek Notification.aspx oluşturabilirim ve sonra çıktı almak için RenderControl yöntemini kullanabilirim. Ancak, Editor.aspx sayfasının codebehind sayfasında, yeni bir örnek oluşturmak için Bildirim'in referansına bile ulaşamıyorum.

Ben yükleme ve başka birinde bir sayfanın oluşturulmasına yönelik en iyi uygulama ...

sayesinde olduğunu merak ediyorum.

cevap

24

Bunu yaparak sayfayı görüntülemeye olabilir: yaşam döngüsü var içinden Sayfa gitmeyecek çünkü

StringWriter _writer = new StringWriter(); 
HttpContext.Current.Server.Execute("MyPage.aspx", _writer); 

string html = _writer.ToString(); 
+1

O aşırı hakkında bilmiyordum. IHttpHandler'ı alan başka bir tane daha var. Bu, Sayfa olaylarına abone olmanıza ve işleme koymadan önce çıktısını değiştirmenize izin verir. Çok güzel ve aşağıda EmailPageHandler kodumu önemli ölçüde basitleştirir. +1 –

+0

teşekkürler. Bu hile basit bir şekilde yapıldı :) şimdi ben de bu işlemi uyumsuz olarak yapabilir miyim? posta gövdesinin html – koraytaylan

+0

oluşturmak için biraz zaman aldığı için bunu yeni bir iş parçacığı oluşturarak yapardım, render kodunu bir yönteme koyardım. Ve yeni iş parçacığı içinde yöntemi çalıştırın. – MartinHN

0

Sayfa sınıfı, bir istek yapıldığında ASP.NET çalışma zamanı tarafından başlatılır. Böylece bir istekte bulunabilir ve yanıtı yakalayabilirsiniz: Yanıtı zorla alabilirsiniz:

using (WebClient client = new WebClient()) 
using (Stream stream = client.OpenRead("http://mysite.com/notification.aspx")) 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    var contents = reader.ReadToEnd(); 
} 
0

Doğru şekilde görüntülenmesi için sayfanın uygun bir HttpContext'e ihtiyaç duyacağını unutmayın.

Bunun yerine bir UserControl kullanmayı düşünürüm. Bunlar, Page.LoadControl() yöntemiyle kolayca yüklenebilir ve işlenebilir. Biraz jiggery-pokery ile, HTML ayıklanırken sayfadaki görüntülemeyi engelleyebilir.

0

RenderControl, çalışmaz. Benzer bir amaç için geçmişte akışı yakalamak için bir HttpHandler ve bir Response.Filter kullandım. Kodu ASP.NET forums previously'da yayınladım.

Düzenleme: Sayfa çıktısını değiştirmeniz gerekirse, bunu MartinNH tarafından Server.Execute aşırı yükleme pointed out ile birleştirmelisiniz. Bu, Response.Filter ve benzeri kaldırılarak kodu basitleştirecektir. Sadece sayfa çıktısını doğrudan istiyorsanız, MartinNH'nin yöntemi temizdir.

0

Bu aradığınız budur: buradan

Type t = BuildManager.GetCompiledType("~/mypage.aspx"); 
Page p = (Page)Activator.CreateInstance(t); 
p.ProcessRequest(HttpContext.Current); 

hayal gücünüzü kullanın ....

İlgili konular