asp.net - 在 ASP.NET 3.5 HTTP 请求之外使用 .aspx 页面作为 HTML 模板

标签 asp.net asp.net-3.5

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

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

  1. 将 .aspx 页面中当前的功能重写为返回 HTML 的 .NET 函数。除非绝对必要,否则我不想花时间重写它。此外,生成 HTML 的 .NET 代码的可维护性远低于 .aspx 标记(是的,即使使用 XML 文字也是如此)。
  2. 当我需要 HTML block 时,向本地服务器上的 .aspx 页面发出 HTTP 请求。我并不担心这种低效率,但设计妥协却让我担心。由于应用程序的结构,我必须在 .aspx 代码中添加以下内容:

    如果(本地请求)
    {doOneThing();}
    其他
    {doTheOtherThing();}

    我不想这样做。

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

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

最佳答案

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

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 处理程序。从这里,您可以绑定(bind)数据并呈现 HTML。

可能让这件事变得困难的是,您通常需要重构现有代码,因为您需要将获取数据与绑定(bind)数据分开。

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

关于asp.net - 在 ASP.NET 3.5 HTTP 请求之外使用 .aspx 页面作为 HTML 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492599/

相关文章:

c# - 使用 NHibernate 在我的模型上实现 IPagedList<T>

iis - 增加堆栈大小IIS ASP.NET 3.5

javascript - map 未加载标记 asp.net

c# - 你能控制 TagBuilder 类呈现属性的顺序吗?

c# - 在 C# Web 应用程序而不是网站中动态加载用户控件

jquery - 回发后显示 jQueryUI 模态

drop-down-menu - 没有选定项目的 ASP.net DropDownList

c# - MS 图表在服务器上不工作

c# - Gridview Paging 将合并单元格数据分开

ASP.NET Intellisense 在属性中不起作用