【问题标题】:aspx ashx mash-upaspx ashx 混搭
【发布时间】:2011-04-07 19:58:15
【问题描述】:

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

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

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

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

提前致谢。

【问题讨论】:

  • 几个问题。是否有特定的设计限制了为什么使用.ashx 处理程序通过直接的.asmx webservice 调用来执行异步操作?客户端 JS 模板是一个可行的选择吗?如果是,您可以拥有一个返回 JSON 数据的 Web 服务,您可以使用 JavaScript 将其格式化为 HTML 客户端,并将新内容插入 DOM。
  • 我对 .asmx 不熟悉(只需查一下!),但这个等式的 Web 服务部分非常简单。至于 JSON 数据,是的,我可以在客户端使用 javascript 将其格式化为 HTML,我只是还没有学会如何生成 JSON 编码的对象。
  • 您使用的是哪个版本的 ASP.NET?

标签: asp.net ajax vb.net


【解决方案1】:

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

建议为每个需要 AJAXy 刷新的 Web 表单元素使用 UpdatePanel 功能。这将使您不必重构一堆代码,并在您的 .ashx 上引入大量 HTML 创建。

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

【讨论】:

  • UpdatePanel 可能是让它工作的最简单方法,但可能会对性能产生负面影响,因为每个异步请求仍会在整个生命周期中运行页面 (related question)。
  • 我第一次尝试使用“UpdatePanel”,但我发现它对我的情况来说非常复杂。我认为如果用户交互发生在需要进行 AJAX 更新的页面上的同一区域中会更容易,但在我的情况下,面板 2 中的用户交互(请参阅我在原始帖子中对页面的描述)是实际上触发了对面板 1 的更新。我以前从未使用过 UpdatePanels,所以也许它们可以提供帮助,但在这种比我在网上找到的示例更复杂的情况下,我无法让它工作。
【解决方案2】:

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

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

编辑:我正在使用 jquery 来说明如何从 grid-row-view 进行操作。

$(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。

【讨论】:

  • 感谢您的帮助:仍在疯狂尝试实施您的第一个建议,但存在一些并发症。一是控件是动态生成的,二是不是普通的按钮。它们是网格视图中的行,每一行都必须向任何将控制刷新的子例程发送不同的参数。到目前为止,我只有For Each drRow as GridViewRow in MyGridView: Dim trigger As System.Web.UI.AsyncPostBackTrigger = New System.Web.UI.AsyncPostBackTrigger(): scriptManager1.RegisterAsyncPostBackControl(drRow)
  • 但是我如何动态地将点击处理程序添加到 GridViewRow(它没有“.Click”属性),然后在客户端的 javascript 中发生了什么?如果可以的话请帮忙!我还是很迷茫!
  • @Noel,你可能很难做到。您应该做的是在 UpdatePanel 中有一个隐藏字段和隐藏的 ASP.NET 提交按钮。现在你所要做的就是编写java-script来填充隐藏字段来告诉哪一行然后模拟按钮的点击。请在我的回答中查看编辑。希望这会有所帮助!
  • 亲爱的 VinayC,感谢您的帮助。我终于让它工作了,虽然性能有点慢。然而,这个练习只给我留下了更多的问题。现在,我正在尝试通过使我的 aspx 页面实现 IHttpHandler 来在没有 UpdatePanels 的情况下进行 Ajax 调用,就像我在上面描述的那样。我关注了您的链接,但效果不佳。您介意在stackoverflow.com/questions/5656474/… 阅读我的新问题吗?到目前为止,您是所有人中最多的帮助,所以如果您有时间,那就太好了。谢谢!
【解决方案3】:

JSON 不是为了那个目的,它是传递使用轻量级符号序列化的对象,您是否需要使用 ashx 流式传输动态生成的 html,response.Write 就是您所拥有的。你可能想看看MVC

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 就我个人而言,我经常发现微软的“简单”解决方案比自己编写代码要困难得多,b/c 当我自己编写代码时,我通常对正在发生的事情有更好的了解。
    • 也就是说,我希望有一个解决方案可以将设计与数据分开。在后端写出 HTML 对我来说也很丑陋。建议?这是我应该使用 JSON 的地方吗?
    • 对此的一种可能的解决方案 - 1.在前端使用 html 标记与数据的占位符 2.使用 JQuery 触发 Ajax 服务器端数据以进行调用 3。此服务器端调用可以返回 JSON。 4. 解析接收到的JSON并填充到占位符中的Javascript函数
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2011-07-25
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多