updatepanel与页面方法

时间:2012-03-04 13:22:23

标签: c# asp.net ajax updatepanel pagemethods

当我想更新页面的特定部分时,我总是使用update panels但是最近我遇到了性能问题(我的意思是它在渲染预期控件方面很慢,有时它不起作用并且需要多次点击工作!!

所以我的问题是:

  • 页面方法是否可以被视为一种有效的替代方法 更新面板并执行ajax魔术?
  • 还有其他选择吗?

请尽可能用一个简单的例子来说明如何使用页面方法替换更新面板?

4 个答案:

答案 0 :(得分:16)

几年前我曾经和你一样,我曾经使用UpdatePanel获得性能,错误的想法我正在提高应用程序的性能 ... < / p>

嗯我完全错了,UpdatePanel是所有UI邪恶的根源,首先它隐藏使用AJAX的复杂性,这使我们大多数人都很容易,给予我们错误地认为我们正在创建响应式应用程序,这比我们根本不使用它时更糟糕(这是我以前在所有页面中使用它的主要原因,我确信这就是许多开发人员使用它的原因它......'很容易)。

考虑以下文章:

当您了解UpdatePanelPageMethod或REST WCF服务的简单调用的真正作用时,您会发现它们之间存在巨大差异。

  • UpdatePanel。当您从UpdatePanel执行帖子时,必须执行整个页面生命周期,这意味着,当您的页面变得复杂且具有多个控件时,它需要在每个帖子上发送所有页面ViewState, ViewState肯定会很庞大,这肯定会成为性能问题。使用它们只能获得部分渲染UpdatePanel中的控件将在没有完整回发的情况下呈现,尽管您需要在每个请求上发送整个ViewState。

  • PageMethod。页面方法是static,它们被称为如果它们是服务方法,它们不需要创建整个页面生命周期以便执行,因此,它们执行得更快。

所以似乎使用PageMethods将是解决方案,问题是PageMethods通常用于返回JSON对象,这意味着您必须手动渲染这些对象 。这意味着,如果您希望摆脱所有UpdatePanel,则必须更改视图中使用的控件,您将无法使用GridView以外的DropDownList例如,您需要为JQGrid(或类似物)更改它。

如果您正在创建MVC应用程序,这是很自然的,但对于传统的ASP.Net,这并不简单。

您还需要考虑一些非常重要的事情,默认情况下每个帖子都会验证ViewState ,您可以将其关闭,但如果您想确定您的ViewState没有已被破坏(take a look at this question)。

考虑这个示例,您有两个SelectedIndexChanged控件,(名为:ddl1,ddl2) ddl2 依赖于 ddl1 ,因此使用UpdatePanel事件你填写第二个下拉列表。但是如果你尝试使用AJAX调用(没有select)来做同样的事情,你将面临两个问题

  • 渲染,您需要手动将对象添加到代表DropDownList的HTML DropDownList控件中。你可以使用第三方框架使用javascript绑定这些控件,我可以推荐你knockoutjs(很棒)

  • 这就是问题。使用javascript更改了第二个Render的内容后,您无法对您的网页进行简单的发布,因为ViewState将无效,您将看到以下异常:

  

无效的回发或回调参数。

解决方法是指定哪些值在服务器端有效,为此,您需要覆盖页面UpdatePanel方法并指定第二个下拉列表中的每个值列表,但这会增加页面大小,显然,这不是一个好的选择

看看:

总而言之,如果您希望摆脱所有{{1}}控件,则需要替换现有的服务器控件以实现对javascript友好的控件。另请注意,如果您这样做,而不是依赖于页面发布机制,则必须使用AJAX在服务器上执行操作,否则,您将获得无效的回发或回调参数。异常。换句话说,如果可能的话,考虑转移到MVC应用程序会更好。

答案 1 :(得分:2)

还有UpdatePanels的替代品,但仍然使用PageMethods。它是jQuery和jQuery templates之间的组合。它被证明比UpdatePanel更快。进一步阅读下面的资源,在那里您可以找到更多专门讨论该主题的文章。

http://encosia.com/use-jquery-and-aspnet-ajax-to-build-a-client-side-repeater/

答案 2 :(得分:2)

您可能会阅读.NET 4.5中即将推出的WebAPI。它适用于WebForms和MVC,如果你可以等待4.5,它可能是你问题的可行解决方案。

只需将它与任何jQuery模板引擎结合使用即可。

http://weblogs.asp.net/scottgu/archive/2012/02/23/asp-net-web-api-part-1.aspx

答案 3 :(得分:1)