2009-11-05 57 views
1

我有一個.aspx頁面,用於處理訂單收據的佈局。我永遠不希望用戶真正進入頁面,我只想填充頁面上的字段,然後將HTML呈現爲發送給客戶的MailMessage。目前,我已經能夠通過使用Server.Execute(「〜/ myreceipt.aspx?orderId = 12345」,writer)完成這項工作,將HTML呈現給作者,然後將其放入消息主體。是否有可能在另一個頁面的代碼隱藏中創建一個ASP.NET頁面的實例?

這樣做的問題在於,它限制了我將orderId傳遞到收據頁面,並進行數據庫調用來提取訂單信息並填充字段,或者通過查詢字符串傳遞每個單獨的字段和填充數據的方式(如〜/ myreceipt.aspx?訂單ID = 12345 &客戶名稱=約翰%20Smith」,等等),這是相當麻煩的。我想要做的是將整個對象傳遞給aspx頁面在我的代碼隱藏中,通過我創建的一些屬性,然後以這種方式填充它,這樣我就可以輕鬆地重複使用相同的信息傳遞給多個視圖,例如銷售團隊的訂單通知,因爲我知道ASP.NET把它的所有頁面當成一個班級,我想我可能能夠做到這樣的事情:

Dim receipt As New ReceiptPage 
receipt.OrderInfo = myOrderInfo 

msg.Body = receipt.Render() 

有誰知道這或類似的方法是可能的嗎?

任何幫助是極大的讚賞,

邁克

回答

2

我明白,這並不直接回答你的問題,但如果你想採取一些數據和格式的HTML郵件,XSL轉換可能是一個更簡潔的方法。幾年前,我對同一種項目的工作非常滿意。它比整個aspx頁面重量輕(尤其是使用DataGrid),並且可以很容易地在.NET中加載和操作。

有一個學習曲線,但我並不認爲這是太糟糕了。我從這裏的教程中瞭解了大部分需要了解的內容:http://www.w3schools.com/xsl/default.asp

如果您喜歡Visual Studio的設計人員,而不想手工編寫整個東西,則可以從具有佈局的ASPX頁面你想在瀏覽器中查看,並保存源代碼作爲起點。爲了展示你的重複數據,我會使用Repeater而不是DataGrid - 一個DataGrid攜帶大量的信息,如果你沒有做回發,就不需要這些信息,一旦你有了你想要的佈局,你可以用一個XSL替換每個中繼器標籤。 .NET的內置XML序列化應該允許您只需幾行代碼即可將底層數據轉換爲XML。

對於我的項目,Altova的XMLSpy幫了很大忙 - 我將一些示例XML保存到一個窗格中,並使用第二個窗格調整我的XSLT,直到結果成爲我想要的結果。這是幾年前;現在可能還有其他好的工具可用。

根據我的經驗,像DataGrids這樣的控件在使用它們的時候非常適合他們的預期目的,但是一旦移動到外面 - 就像這個項目一樣 - 你會花費與你一樣多的時間與它們作戰手工創建類似XSLT的東西,並且對結果的控制要少得多。

最後:你對HTML電子郵件是正確的。他們應該避免,但是當他們不能時,你想確保你發送的HTML儘可能乾淨和簡單。如果創建一個乾淨的模板,而不是依賴.NET的渲染,則更有可能獲得該結果。您的收件人可能會使用所有不同的電子郵件客戶端,並且Outlook和Lotus(例如)在顯示HTML郵件時行爲非常不同。在這兩個方面創建看起來體面的消息是我項目中最大的障礙,而不是首先生成HTML。

我希望這是有幫助的,而不是太離題。

+0

Jeremy, 感謝您的答覆。我一定會研究XSLT作爲一種可能性。如果我對他們瞭解甚少,那麼他們可以非常方便地用於系統集成場景。 – mclark1129 2009-11-05 18:02:35

3

ASP.Net頁面只是簡單繼承了一定的基礎型老.NET類,你可以像任何其他類中創建實例。但是正確呈現該頁面的html的過程是... complicated。我不會推薦這樣做。

我本來以爲你可能只用一個自定義的控制,而不是,但在重新閱讀你的問題,我看這是一個通過電子郵件發送,所以自定義控件也沒有那麼好一個合適的。

但我仍然認爲一個asp.net頁面是矯枉過正的,因爲您不必擔心回發,查詢字符串,會話等事情。您基本上只是將模板值插入字符串變量,甚至如果其中一個模板位置(收據網格)稍微複雜一點或者本身可能是模板字符串。

這可能是一個罕見的情況下像我CompiledFormat實現更好的貼合。

+0

通過自定義控件,你的意思是UserControl或更高級的自定義服務器控件?我知道一個UserControl確實有一個RenderControl()方法,那麼使用該方法是否需要在.aspx頁面上使用相同的複雜過程? – mclark1129 2009-11-05 16:32:05

+0

對不起,我重新閱讀您的問題,並且自定義控件可能不太合適。我刪除了那部分,幾分鐘後會有更好的東西。 – 2009-11-05 16:32:54

+0

感謝您的回覆, 問題是我想發送的電子郵件是HTML格式,而不是純文本格式。在我的.aspx中,我使用控件(如標籤),最重要的是使用DataGrid來幫助佈局信息。儘管使用實際的.aspx頁面可能有點矯枉過正,但我​​的直覺表明,與嘗試通過文本完成類似的佈局(儘管我相信文本電子郵件具有更高的傳輸速率)相比,它的涉入更少。在完全放棄我的方法之前,我將首先使用UserControl一個鏡頭。 – mclark1129 2009-11-05 17:07:05

0

在處理ReceiptPage的信息之前,存儲需要傳遞給Session變量的對象並在ReceiptPage的後面的代碼中讀取該對象是否可行?在這種情況下,您可以使用方法你在問題本身中提出了建議。 (Server.Execute())

只是一個想法。

相關問題