是否可以在另一个页面的代码隐藏中创建ASP.NET页面的实例?

时间:2009-11-05 16:21:53

标签: asp.net code-behind

我有一个.aspx页面,用于处理订单收据的布局。我不希望用户实际访问该页面,我只想填充页面上的字段,然后将HTML呈现为一个发送给客户的MailMessage。目前,我已经能够通过使用Server.Execute(“〜/ myreceipt.aspx?orderId = 12345”,writer)将HTML呈现给作者,然后将其放入消息体中。

这个方法的问题在于它限制我将orderId传递给收据页面并进行数据库调用以提取订单信息并填充字段,或者通过查询字符串传递每个单独的字段填充数据的方式(例如〜/ myreceipt.aspx?orderId = 12345& customerName = John%20Smith“等)相当麻烦。我想做的是将整个对象传递给aspx页面我通过我创建的一些属性进行代码隐藏,然后以这种方式填充它。这样我可以轻松地重复使用相同的信息传递给多个视图,例如销售团队的订单通知。因为我知道ASP.NET处理作为一个班级的所有页面,我想我可能能够完成这样的事情:

Dim receipt As New ReceiptPage
receipt.OrderInfo = myOrderInfo

msg.Body = receipt.Render()

有人知道这种或类似方法是否可行?

非常感谢任何帮助,

麦克

3 个答案:

答案 0 :(得分:3)

ASP.Net页面只是继承某种基类型的普通旧.Net类,您可以像创建任何其他类一样创建实例。但正确呈现该页面的html的过程是...... complicated。我不建议那样做。

我原本以为您可能只是使用自定义控件,但重新阅读您的问题我看到这是通过电子邮件发送,因此自定义控件不太适合。

但是我仍然说asp.net页面太过分了,因为你不必担心回发,查询字符串,会话等等。你实际上只是在字符串变量中插入模板值,即使其中一个模板位置(收据网格)稍微复杂一点,或者本身就是模板字符串。

这可能是一种罕见的情况,例如我的CompiledFormat实施更适合。

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

我希望这有用,而且离主题不太远。

答案 2 :(得分:0)

在处理ReceiptPage的信息之前,您是否有可能存储需要在Session变量中传递的对象并在ReceiptPage后面的代码中读取相同内容...在这种情况下,您可以使用方法在问题本身中提出。 (使用Server.Execute())

只是一个想法。