2009-10-15 100 views
2

我在我的网站上有两个页面,这些页面用数据库中的内容填充,还有用户输入的字段(不要问!)。这些页面还包含一个带有嵌套DataList的ListView。这些页面上有按钮,当点击抓取页面的html内容时,将其写入HtmlTextWriter,然后获取文本并将其放入电子邮件中。Asp.Net的电子邮件内容

我需要做的是在放入电子邮件之前用html字符串替换HTML源代码中的任何TextBox/DropDownLists。

我的aspx代码到目前为止看起来是这样的:

<div id="mailableContent" runat="server"> 
    <asp:TextBox ID="txtMessage" runat="server"/> 
    <asp:Label ID="lblContentFromDb" runat="server"/> 
    <asp:ListView ID="lvwOffices" runat="server"> 
     //loads of stuff here including more textboxes for the user to fill in 
    </asp:ListView> 
</div> 

和代码隐藏是这样的:

StringBuilder stringBuilder = new StringBuilder(); 
StringWriter writer = new StringWriter(stringBuilder); 
HtmlTextWriter htmlWriter = new HtmlTextWriter(writer); 
mailableContent.RenderControl(htmlWriter); 
MailMessage message = new MailMessage(); 
//do more stuff to set up the message object 
message.Body = stringBuilder.ToString(); 
//send the message 

我的想法至今都为1手动设置任何文本框为Visible = false,然后用相应的文本框值填充文字控件,这相当混乱和繁琐。注意我必须去掉输入控件,否则电子邮件的html需要用一个表单元素包装,我不想这样做。

有没有更好的方法来做到这一点,我想也许做一些.Net1.1样式xslt转换与xml文件中定义的页面内容可能是一个更好的方法来解决这个问题,但我不确定这是否这将处理我的要求,当前我正在使用带有嵌套DataList的ListView。

回答

1

我发现你所描述的有很多开销。你的电子邮件模板保持不变吗?如果是这样,为什么不简单地使用HTML 3代码简单的HTML模板。然后简单地从磁盘读取该文件,并用动态内容替换特定的peices(即。## Name ##)。通过这种方式,您可以完全控制通过电子邮件发送的html,并且可以控制用户输入的内容。

这也会限制工作量以使html与电子邮件客户端兼容。

说明性:在前面的建议中,我提出UI实现和Email实现是截然不同的,这反过来又允许以更灵活的方式撰写电子邮件。如果不使用

mailableContent.RenderControl(htmlWriter); 

这也可以让你的的ListView内容撰写您的规格。

+0

谢谢你的提问stion,但是这是如何解决ListView/DataList需求的? – 2009-10-15 11:04:58

+0

我会继续前进,我不确定我是否理解这个问题。 – 2009-10-15 11:58:16

1

夫妇的想法:

  1. 使用正则表达式替换文本框和dropdownlists用明文的HTML输出。 (靠谱,找到<option selected="selected">东西的并发症

  2. 做我想做的:

    • 例如创建界面IPlainTextable
    • 使界面执行所谓PlainTextMode布尔属性(设置默认为false)
    • 扩展TextBox和DropDownList的使用实现IPlainTextable
    • 在您的扩展器WebControls的渲染部分自己的控件,呈现出明文值如果PlainTextMode为真。 e.g您的文本框

      protected override void Render(HtmlTextWriter writer) 
      { 
          if (PlainTextMode) 
           writer.WriteLine(this.Text); 
          else 
           base.Render(writer); 
      } 
      
    • 的子类,呈现出你的网页,通过所有IPlainTextable控制运行,并设置PlainTextModetrue之前。

我已经写了一个漂亮的小方法,通过嵌套控件集迭代:

public static List<T> FindControlsOfType<T>(Control ctlRoot) 
{ 
    List<T> controlsFound = new List<T>(); 

    if (typeof(T).IsInstanceOfType(ctlRoot)) 
     controlsFound.Add((T)(object)ctlRoot); 

    foreach (Control ctlTemp in ctlRoot.Controls) 
    { 
     controlsFound.AddRange(FindControlsOfType<T>(ctlTemp)); 
    } 

    return controlsFound; 
} 

所以你只是这样做:

foreach (IPlainTextable ctl in FindControlsOfType<IPlainTextable>(this)) 
{ 
    ctl.PlainTextMode = true; 
} 

然后做你的渲染字符串后...