aspx ashx mash-up

时间:2011-04-07 19:58:16

标签: asp.net ajax vb.net

我正在使用AJAX功能改编.aspx页面(使用VB,而不是C#)。代码隐藏使用从Web服务中提取的数据填充页面。该页面有两个面板(以这种方式使用不同的数据)。在整页刷新时,可能需要填充一个或两个面板。但填充Panel 2可能需要很长时间,我需要能够在不刷新Panel 2的情况下更新面板1.因此需要AJAX(对吗?)

我提出的解决方案仍然具有带.aspx.vb代码隐藏的旧.aspx页面,但是在混合中引入了Generic Handler(.ashx)页面。前两个组件在用户第一次访问或整页刷新时完成工作,但是当调用AJAX时,请求由.ashx页面处理。

第一个问题:这是一个健全的架构吗?我没有在网上找到像我一样的情况。最初,我想通过让代码隐藏实现IHttpRequest,然后提供“ProcessRequest”和“IsReusable”方法将.aspx页面变成AJAX处理程序,但我发现我无法将常规访问页面与AJAX分开请求,所以我的AJAX处理程序甚至在第一次访问页面时接管了。第二个问题:我是否认为这种方法(使得.aspx页面作为AJAX处理程序具有双重功能)永远不会起作用?是否无法判断我们是在获取整页请求还是部分页面(AJAX)请求?

如果架构 好,那么我需要在.ashx文件中动态生成大量HTML,对吧?如果这是正确的,我应该将HTML发送回客户端,还是应该以某种方式对其进行编码?我听说过JSON加密,但还没弄清楚如何使用它。那么,第三个问题:“context.Response.Write”是将数据发送回客户端的唯一管道吗?如果是这样,我应该发回HTML或某种JSON编码的对象吗?

提前致谢。

4 个答案:

答案 0 :(得分:1)

听起来好像页面需要在UI中添加一些AJAX功能。

建议对需要进行AJAXy刷新的每个Web表单元素使用UpdatePanel 功能。这样可以避免重构一堆代码,并在.ashx上引入大量的HTML创建。

从长远来看,它将更易于维护,并且需要更短的开发周期。

答案 1 :(得分:0)

我同意@ p.campbell和@ R0MANARMY。 UpdatePanel可能是最简单的方法。

但是跟我一样,如果你不想走UpdatePanel路线,我认为你的方法没有任何问题。但是,在后端动态(完全)生成html并不是我个人更喜欢的路径(出于维护原因)。我宁愿选择一种能够将设计与数据分开的解决方案。

答案 2 :(得分:0)

JSON不是为了那个目的,而是传递用一个很好的轻量级表示法序列化的对象,你需要使用ashx流式传输生成的html,response.Write是你拥有的。您可能需要查看MVC

或者您可以使用jquery,如果它只是html,最简单的是load函数,或者您可以使用jquery查看Ajax。由于ashx可以作为任何资源使用,因此可以在加载函数中使用。

答案 3 :(得分:0)

正如其他人所指出的,UpdatePanel将是一种更简单的方法 - 但您需要使用多个更新面板,并将UpdateMode属性设置为conditional。然后,您可以使用页面上的任何按钮(请参阅AsyncPostBackTrigger)或甚至使用java脚本(请参阅this& this)来触发更新面板刷新。在服务器端,您可以决定触发部分回发的内​​容,并在不需要时绕过某些代码进行相应的操作。

您也可以使用您的方法 - 这里的技巧是使用您的ashx中的HttpServerUtility.Execute捕获页面输出并将其写回响应(请参阅this article此技巧已用于捕获用户控制输出)。此方法的唯一限制是您只能模拟对页面的GET请求,因此您可能必须通过查询字符串更改页面以接受参数。就个人而言,我建议您创建一个通过方法/属性接受参数的用户控件,并生成必要的输出,然后在页面和ashx中使用控件(通过动态加载它在一个页面 - see this article

编辑:我正在使用jquery来说明如何从网格行视图中执行此操作。

$(document).ready(function() {
   $("tr.ajax-grid-row").click(function() {
       $("#hidden-field-id").val($(this).find(".row-id").val()); // fill hidden filed
       $("#hidden-button-id").click(); // simulate button click
   });
});

你可以将上面的脚本放在标记中的head元素中 - 它假设你用css类“ajax-grid-row”装饰每个网格行视图,每行都有用css类装饰的隐藏字段“ row-id“存储行标识符或要传递给该行的服务器的值。您也可以使用单元格(但是您需要使用innerHTML来获取每行的值)。 “hidden-field-id”和“hidden-button-id”是隐藏字段和提交按钮的客户端ID - 如果这些是服务器控件,则应使用Control.ClientID来获取实际控件ID。