代码之家  ›  专栏  ›  技术社区  ›  mclark1129

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

  •  1
  • mclark1129  · 技术社区  · 15 年前

    我有一个.aspx页面,用于处理订单收据的布局。我不希望用户真正进入页面,我只希望填充页面上的字段,然后将HTML呈现为发送给客户的邮件消息。目前,我已经能够通过使用Server.Execute(“~/myreceive.aspx?orderId=12345”,writer)将HTML呈现给一个编写器,然后将其放入消息体中来完成这项工作。

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

    Dim receipt As New ReceiptPage
    receipt.OrderInfo = myOrderInfo
    
    msg.Body = receipt.Render()
    

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

    非常感谢您的帮助,

    迈克

    3 回复  |  直到 15 年前
        1
  •  3
  •   Community CDub    8 年前

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

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

    但我仍然认为asp.net页面是一种过火的操作,因为您不必担心回发、查询字符串、会话等问题。实际上,您只是将模板值插入字符串变量中,即使其中一个模板位置(收据网格)稍微复杂一点,或者其本身可能是模板字符串。

    CompiledFormat 实施更合适。

        2
  •  2
  •   Jeremy Gruenwald    15 年前

    我知道这并不能直接回答您的问题,但如果您试图获取一些数据并格式化HTML消息,XSL转换可能是一种更干净的方法。几年前,在同一个项目中,这对我来说非常有效。它比整个aspx页面(尤其是使用DataGrid)的重量要轻得多,并且在.NET中很容易加载和操作。

    有一点学习曲线,但我不认为这太糟糕。我从这里的教程中学到了我需要知道的大部分内容: http://www.w3schools.com/xsl/default.asp

    如果您喜欢VisualStudio的设计器,不想手工编写整个内容,可以从具有所需布局的ASPX页面开始,在浏览器中查看,并将源代码另存为起点。为了布局重复的数据,我会使用一个转发器而不是数据网格-如果不进行回发,数据网格会携带大量不需要的信息,一旦获得了所需的布局,就可以用XSL替换转发器标记。NET的内置XML序列化应该允许您只需几行代码就可以将底层数据转换成XML。

    对于我的项目,Altova的XMLSpy帮助很大——我将一些示例XML保存到一个窗格中,并使用第二个窗格调整XSLT,直到结果符合我的要求。这是几年前的事了;现在可能还有其他好的工具可用。

    最后:关于HTML电子邮件,你是对的。它们是可以避免的,但是当它们不能避免时,您需要确保您发送的HTML尽可能干净和简单。如果您创建一个干净的模板,那么比依赖.NET的渲染更可能得到这样的结果。您的收件人可能会使用所有不同的电子邮件客户端,而Outlook和Lotus(例如)在显示HTML消息时的行为非常不同。创建在这两个方面看起来都不错的消息是我项目中最大的障碍,而不是首先生成HTML。

    我希望这是有帮助的,不要离题太远。

        3
  •  0
  •   The King    15 年前

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

    只是一个想法。