不同的HTML,相同的Codebehind&相同的控制

时间:2009-08-14 10:19:16

标签: c# .net asp.net c#-3.0

我正在建立一个网站,允许人们向选择不同模板的人发送电子邮件。当他们设置了电子邮件并选择了模板后,用户就可以预览它了。目前,这会将相应的aspx页面加载到所选的模板。

我目前有3个模板,但预计会大幅增长。

aspx页面都具有相同的控件,具有相同的名称,甚至代码隐藏(cs)页面也是相同的。因此,如果我能够以某种方式将这些页面组合在一起并最小化重复,甚至只使用一个页面,而是加载与所选模板相对应的HTML,那将会更加简单和有效。

我无法想出一个合适的方法来做到这一点,或者甚至可以解决这个问题。我可能已经到了无法直接思考这个问题的地步,因为它让我头疼。

所以.....

请请给我一些解决方案,甚至只是建议。 ; - )

感谢。


附加信息

作为一个额外的问题,我必须在创建电子邮件时以编程方式重新创建模板,并将其作为HTML电子邮件发送给收件人。这是通过不同的页面完成的,因此会产生更多重复,以便最小化。

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

模板的MasterPages怎么样?在PageLoad中选择适当的母版页。

如果是内容然后使用CSS进行格式化(显然可以更改在Pageload上加载的CSS),占位符和从数据存储中为邮件填充它们是另一种选择。

它认为解决方案可能与StackOverflow上的用户一样多;)

答案 2 :(得分:0)

如果后面的所有控件和代码都相同,那么您是否无法将所有控件放入母版页中,只是将内容页面用于实际的电子邮件?

啊,我明白了。虽然它的变化总是在类似的结构中?因为您可以在母版页中拥有多个内容持有者。因此,在母版页中,您可以将控件内容包含在控件中,如下所示:

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

答案 3 :(得分:0)

我还没有发现asp.net web表单页面,母版页或mvc非常适合这类事情。这就像用大锤打开花生一样。

创建一些自定义xml标签然后自己合并它们非常简单。将模板保存在数据库中并随时进行合并,而无需运行asp.net的所有开销。使用敏捷原则:首先创建测试并向后工作,您可以立即获得所需的运行。

最基本的是直线替换。如果你需要更多,听起来不像你那样,你可以使用xslt或只是走DOM(即将模板存储为xhtml并拥有自己的自定义标签支持)。

还存在部署问题。更新数据库中的模板要比将文件上载到服务器容易得多。如果您确实沿着使用Web表单的路线前进,请确保在您之前了解部署方案。

警告:HTML电子邮件很棘手,并且有很多丑陋(从html的角度来看)让它们在电子邮件客户端中统一呈现。期待像1999年一样对html进行编码,这几乎就是html电子邮件的状态。悲伤却又是真的。