使用.aspx页面作为ASP.NET 3.5 HTTP请求之外的HTML模板

时间:2009-09-29 13:34:36

标签: asp.net asp.net-3.5

我需要生成一个HTML块,供HTTP请求触发的异步操作使用(我调用Facebook API来响应HTTP请求,HTML块作为参数)。我已经有一个生成所需HTML的.aspx页面,并希望重用该代码。

我看到三个选项,我都不想做:

  1. 将当前在.aspx页面中的功能重写为返回HTML的.NET函数。除非绝对必要,否则我不想花时间重写它。此外,生成HTML的.NET代码将比.aspx标记更难维护(是的,即使使用XML文字)。
  2. 当我需要HTML块时,向本地服务器上的.aspx页面发出HTTP请求。效率低下并不关心我,但设计妥协确实如此。由于应用程序的结构如何,我不得不将我的.aspx代码丢弃:

    如果(localRequest)
    {doOneThing();}
    否则
    {doTheOtherThing();}

    我不想这样做。

  3. 创建一个ASP.NET应用程序主机以吐出这些HTML块。我想这会提高2的效率,但不会提高复杂性。

  4. 还有其他选择吗?理想情况是实例化.aspx页面类并使用模拟的HttpRequest或HttpContext执行它。这可以做到,值得麻烦吗?

1 个答案:

答案 0 :(得分:3)

这个问题有两个相关但不同的部分:

a)如何确保异步操作具有有效的HttpContext?

b)如何以字符串形式返回ASPX执行的HTML输出?

对于(a),它取决于您如何调用异步操作。不幸的是,在.NET中有quite a few ways to do async operations。但是如果你想将HttpContext传播到异步代码,那么只有一个很好的选择:Event-based Asynchronous Pattern。虽然恕我直言,基于事件的异步模式有一些缺点(例如没有“等待”操作,难以同步多个线程,需要重构代码等),但它与ASP.NET异步页面完全集成非常酷。确保在回调获得控制权时设置正确的上下文。

因此换句话说,如果您正在按照为ASP.NET异步页面设置的规则进行播放,那么传播上下文只能起作用(不需要做很多额外的工作)。如果您不熟悉,请参阅async pages上的文章。这是有用的another post。简而言之,您将页面处理分为三个阶段: 1)设置长时间运行的操作 2)开始长时间运行(例如,获取昂贵的数据) 3)一旦所有长时间运行的操作完成,ASP.NET将调用您的Page_PreRenderComplete处理程序。从这里,您可以绑定数据并呈现HTML。

可能会使这一点变得困难的是,您通常需要重新分配现有代码,因为您需要将数据从绑定数据中分离出来。

现在,在上面的(b)中:一旦你有了上下文,另一个问题是如何将你的页面输出变成一个字符串。有几种方法可以做到这一点,但最简单的方法是将要输出的内容封装到用户控件(.ASCX)中,然后按照此博客文章中的说明进行操作:http://stevesmithblog.com/blog/render-control-as-string/。如果您还需要数据绑定,请参阅this post