当我想更新页面的特定部分时,我总是使用update panels
但是最近我遇到了性能问题(我的意思是它在渲染预期控件方面很慢,有时它不起作用并且需要多次点击工作!!
所以我的问题是:
ajax
魔术?请尽可能用一个简单的例子来说明如何使用页面方法替换更新面板?
答案 0 :(得分:16)
几年前我曾经和你一样,我曾经使用UpdatePanel
来获得性能,错误的想法我正在提高应用程序的性能 ... < / p>
嗯我完全错了,UpdatePanel
是所有UI邪恶的根源,首先它隐藏使用AJAX的复杂性,这使我们大多数人都很容易,给予我们错误地认为我们正在创建响应式应用程序,这比我们根本不使用它时更糟糕(这是我以前在所有页面中使用它的主要原因,我确信这就是许多开发人员使用它的原因它......'很容易)。
考虑以下文章:
当您了解UpdatePanel
对PageMethod
或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
方法并指定第二个下拉列表中的每个值列表,但这会增加页面大小,显然,这不是一个好的选择
看看:
ASP.NET Event Validation and “Invalid Callback Or Postback Argument” : Part I
ASP.NET Event Validation and “Invalid Callback Or Postback Argument” : Part II
总而言之,如果您希望摆脱所有{{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)