updatepanel与页面方法

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

所以我的问题是:

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

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

几年前我曾经像你一样,我曾经使用UpdatePanel 获得性能,错误的想法我正在提高我的应用程序的性能 ……

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

请考虑以下文章:

  • 为什么不应将整个站点放在UpdatePanel中

  • UpdatePanel是邪恶的

当您了解UpdatePanel对简单调用PageMethod或REST WCF服务的真正作用时,您将看到它们之间的巨大差异。

  • UpdatePanel 。 当您从UpdatePanel执行post时,必须执行整个页面生命周期,这意味着,它需要在每个post上发送所有页面ViewState,当您的页面增加复杂的几个控件时,ViewState肯定会巨大的,这肯定会是一个性能问题。 使用它们只能获得部分渲染 ,尽管您需要在每个请求上发送整个ViewState,但UpdatePanel的控件将在没有完整回发的情况下呈现。

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

因此,使用PageMethods似乎是解决方案,问题是PageMethods通常用于返回JSON对象,这意味着您必须手动渲染这些对象。 这意味着如果你想要摆脱你所有的UpdatePanel你将不得不更改你的视图中使用的控件,你将无法使用GridView开箱即用,相反,你会有为JQGrid (或类似物)改变它。

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

您还需要考虑一些非常重要的事情, 默认情况下会在每个post上validationViewState ,您可以将其关闭,但如果您想确保您的ViewState未被破坏,则不建议这样做( 请查看此问题 ) 。

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

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

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

无效的回发或回调参数。

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

看一看:

  • ASP.NET事件validation和“无效的回调或回发参数”:第一部分

  • ASP.NET事件validation和“无效的回调或回发参数”:第二部分

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

UpdatePanels有一个替代方案,但仍然使用PageMethods。 它是jQuery和jQuery模板的组合。 它被certificate比UpdatePanel更快。 进一步阅读下面的资源,在那里您可以找到更多专门讨论该主题的文章。

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

您可能会阅读.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

看看http://uframe.codeplex.com/