2009-08-14 130 views
0

我正在建立一個網站,允許人們發送電子郵件給具有不同模板選擇的人。當他們設置了他們的電子郵件並選擇了一個模板後,用戶就可以預覽它。目前,這會將相應的aspx頁面加載到所選的模板中。不同的HTML,相同的代碼隱藏和相同的控件

我目前有3個模板,但預計這會大幅增長。

aspx頁面都具有相同的控件,具有相同的名稱,甚至codebehind(cs)頁面也是一樣的。因此,如果我能以某種方式將這些頁面連接在一起並最大限度地減少重複,可能會更加簡單和高效,甚至可能只使用一個頁面,但加載與所選模板對應的HTML。

我不能想出一個合適的方法來做到這一點,或者甚至解決它的可能。我很可能已經到了我無法直視這個問題的地步,因爲它給了我這麼頭痛的問題。

所以.....

請給我一些解決方案,甚至只是建議。 ;-)

謝謝。


附加信息

作爲一個額外的問題,我已經被創建和發送到收件人的HTML郵件的電子郵件時以編程方式重新創建模板。這是通過一個不同的頁面完成的,因此導致更多的重複,這個id就像最小化一樣。

回答

1

創建一個Page類,讓說,TemplateViewerPage

TemplateViewerPage.cs

using System; 
using System.Web.UI; 

public partial class TemplateViewerPage : Page 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     // load your properties 
     _subject = "test"; 
     _messageBody = "body"; 

     base.OnLoad(e); 
    } 

    // your property 
    private string _subject; 
    public string Subject 
    { 
     get { return _subject; } 
     set { _subject = value; } 
    } 

    private string _messageBody; 
    public string MessageBody 
    { 
     get { return _messageBody; } 
     set { _messageBody = value; } 
    } 
} 

那麼你就可以爲模板A創建查看器:

ViewerA.aspx

<%@ Page Language="C#" AutoEventWireup="false" Inherits="TemplateViewerPage" CodeFile="TemplateViewerPage.cs" %> 

<!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> 
     <table> 
      <tr> 
       <td>Subject</td> 
       <td> <%= Subject %> </td> 
      </tr> 
      <tr> 
       <td>Message</td> 
       <td> <%= MessageBody %> </td> 
      </tr> 
     </table> 
    </div> 
    </form> 
</body> 
</html> 

和ViewerB,背後相同的代碼(的CodeFile = TemplateViewerPage.cs)

ViewerB.aspx:

<%@ Page Language="C#" AutoEventWireup="false" Inherits="TemplateViewerPage" CodeFile="TemplateViewerPage.cs" %> 

<!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> 
     <div class="subject"> 
      <%= Subject %> 
     </div> 
     <div class="message"> 
      <%= MessageBody %> </td> 
     </div> 
    </div> 
    </form> 
</body> 
</html> 
+0

但我想推薦你使用asp.net mvc框架。 – 2009-08-14 10:34:48

+0

您不必爲每個模板創建一個查看器類。我剛剛編輯了我的答案。 – 2009-08-14 11:37:37

+0

有什麼區別:<%= Subject%>和<%#Subject%>? – Munklefish 2009-08-14 12:17:10

0

模板的MasterPages如何?在PageLoad中選擇適當的母版頁。

如果是內容然後使用CSS進行格式化(您可以明顯更改在Pageload加載的CSS),也可以從數據存儲中爲郵件填充佔位符並填充它們,這是另一種選擇。

它認爲有因爲有StackOverflow上的用戶可能是因爲許多解決方案;)

+0

CSS +佔位符,不只是CSS :) – Lazarus 2009-08-17 07:32:33

+0

由於我們需要HTML電子郵件在瀏覽器中看起來相當一致,因此不使用CSS。根據所有帳戶,這是不現實的使用CSS,所以表用於定位。 – Munklefish 2009-08-17 09:48:00

0

如果所有的控件和代碼背後都是一樣的,不能你把所有的控制到一個母版頁中,並簡單地使用實際電子郵件的內容頁面?

啊我明白了。儘管它發生了變化,它總是處於類似的結構中?因爲您可以在主頁面中擁有多個內容持有人。因此,在母版,你將能夠有圍繞控制包裹內容如下:

 <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> 
    </asp:ContentPlaceHolder> 
    <asp:Button ID="button1" runat="server" /> 
    <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server"> 
    </asp:ContentPlaceHolder> 
+0

控件使用html而不是css來定位。我將如何包裝控件的HTML?由於html是唯一改變的東西。 – Munklefish 2009-08-14 11:15:26

+0

上面編輯的答案。 – Fishcake 2009-08-14 12:43:35

+0

也許我有一個心理障礙,不能看到你想要解釋什麼。從我的角度來看,這種方法無助於控制,因爲控件放置在不同的位置,並按照不同的模板進行訂購。 – Munklefish 2009-08-17 09:46:31

0

我還沒有發現asp.net web表單頁面,母版頁,或MVC是一個非常好的適合這種事情。就像用大錘打開花生一樣。

創建一些自定義xml標籤然後自己合併它們非常簡單。將模板保存在數據庫中並隨時合併,而不需要運行asp.net的所有開銷。使用敏捷原則:首先創建您的測試並向後工作,您將立即得到您所需要的內容。

最基本的是直線替換。如果你需要更多,它聽起來不像你所做的,你可以使用xslt或者只是走DOM(即將你的模板存儲爲xhtml並且有你自己的自定義標籤支持)。

還有一個部署問題。更新數據庫中的模板要比將文件上傳到服務器要容易得多。如果您確實遵循了使用Web表單的路線,請確保您瞭解您之前的部署方案。

警告:html電子郵件是棘手的,並且有很多醜陋的(從html的角度來看)讓他們在電子郵件客戶端統一呈現。希望能像1999年那樣對html進行編碼,而這正是html電子郵件的狀態。悲傷但真實。

相關問題