惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
U
Unit 42
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
G
Google Developers Blog
I
InfoQ
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
Jina AI
Jina AI
量子位
宝玉的分享
宝玉的分享
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
美团技术团队
The Hacker News
The Hacker News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tailwind CSS Blog
博客园 - 司徒正美
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
Vercel News
Vercel News
Martin Fowler
Martin Fowler
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Forbes - Security
Forbes - Security
Attack and Defense Labs
Attack and Defense Labs
Google DeepMind News
Google DeepMind News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
P
Privacy International News Feed
G
GRAHAM CLULEY
The Last Watchdog
The Last Watchdog
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
V2EX - 技术
V2EX - 技术

博客园 - Jun1st

Application之间共享Master Page ASP.NET AJAX 4的Client-Side Template和DataView 体验ASP.NET4之ClientID 体验ASP.NET 4之URL Routing 使用Extension Methods来使IDataReader更加方便 Custom WCF Configuration File USE HttpRuntime.Cache OVER HttpContext.Current.Cache Make Asynchronous Calls from Page IIS and VS Embedded Local Web Server Integrate jQuery with ASP.NET Data Controls Tech-Ed 2008 上海 ASP.NET MVC的分页和导航 LINQ and Pipeline Pattern Why Would a .Net Programmer Learn Ruby On Rails(翻译) ASP.NET MVC之AJAX Asp.Net MVC---Walkthrough Asp.Net MVC 入门篇——Overview Asp.Net 2.0之SqlCacheDependency Security Basics and ASP.NET Support(翻译)
ASP.NET AJAX 4的Client-Side Template和DataView
Jun1st · 2009-11-04 · via 博客园 - Jun1st

2009-11-04 23:37  Jun1st  阅读(375)  评论()    收藏  举报

作为一个从事.NET Web技术的开发人员,似乎没有什么理由可以不懂微软自己的AJAX框架,虽然它可能不太好用,或者用起来没有像jQuery这样的框架那么爽。我没有怎么用过UpdatePanel来做过复杂的东西,所以对于这个的优缺点就不予置评了。对于客户端的ASP.NET AJAX的客户端JS Library,还是有一定了解的,相比于jQuery,总觉得微软把JS搞得跟C#似的有命名空间, 接口,继承这些特性有点别扭,用起来也还是没有jQuery顺手。

不过在看了ASP.NET AJAX 4.0新添加的一些新特性之后,觉得还是很不错的,解决了实际开发中经常会遇到的问题,因此值得学习一下。

Client-Side Template

在用AJAX从服务器端取得数据之后,有时候会让人头疼的一个问题就是数据如何展示,尤其是当数据量比较大的时候,这个时候我们就比较想念DataGrid,GridView了。当然,我们可以借用服务器端控件的Render方法,在服务器端把数据绑定到控件上之后,直接写到Response中。不过这种方法把数据和UI糅合在了一起,不是很令人满意。现在,微软为我们带了Client Site Template,解决了这个问题。

首先,用Html定义一个Template:

01.<div id="details-container" style="display: none">

02.</div>

03.  

04.<div id="details-template" class="sys-template">

05.    <h3>

06.        Details for {{ Name }}</h3>

07.    <p>

08.        Department {{ Department }} <br />                                   

09.        Title {{ Title }}

10.    </p>

11.</div>

而对于sys-template,只是设置 {visibility:hidden; display:none;}

ID为details-container的Div顾名思义,就是包含template的地方。在UI都定义好之后,就可以从服务器端取数据了。

01.function fetchAndShowDetails(eventElement) {

02.    var container = $get("details-container");

03.    $(container).hide().empty();

04.  

05.    var manager = getDetailWithId(123);

06.    var detailsTemplate = new Sys.UI.Template($get("details-template"));

07.    detailsTemplate.instantiateIn(container, manager);

08.  

09.    $(container).show();

10.}

11.  

12.

13.function getDetailWithId(managerId)

14.{

15.    var person = { Name: "Beckham", Title: "Football Star", Department: "Man United", Fans: [{Name:"Beckham1"},{Name:"Beckham2"},{Name:"Beckham3"}] };

16.  

17.    return person;

18.}

这里的getDetailWithID只是简单的返回了一个JSON对象,而在实际情况中,这里需要完成的工作就是从服务器端取回数据。在取得数据之后,通过$get()获取定义好的template,并把它构建成一个Sys.UI.Template, 再调用instantiateIn完成数据的赋值。到此为止了,挺简单的方式。但是这只解决了一个问题,这里只显示了一条数据,如果有多条数据需要显示,那似乎就不能用这个了。这个时候,我们需要用的是DataView

使用DataView

同样是使用上面的例子,但是这次需要显示Backham的Fans, 而Beckham有很多的Fans,因此给Template加一个ul来显示fans信息

01.<div id="details-template" class="sys-template">

02.    <h3>

03.        Details for {{ Name }}</h3>

04.    <p>

05.        Title {{ Title }}; Department {{ Department }}</p>                 

06.    <h4>Fans:</h4>

07.    <ul class="sys-template">

08.        <li>{{Name}}</li>

09.    </ul>       

10.</div>

在页面中改变不大,关键还是在JS代码中,在同样的fetchAndShowDetails中,需要在container.show()之前,加一个renderFansList,这个函数才是关键

01.function renderFansList(person, container) {

02.    var dataItem, element;

03.      

04.    dataItem = person.Fans;

05.    element = $('ul', container)[0];

06.  

07.    $create(Sys.UI.DataView,

08.            { data: dataItem },

09.            {},

10.            {},

11.            element);

12.}

代码其实很简单,一目了然,如果看上去陌生,那只不过需要一个对API熟悉的过程。在VS2010 Beta2中创建的web application,已经默认包含了jQuery库,因此在上面的JS代码中会看到$()和$get()的混用。

总结

在实际应用中,可能需要Template和DataView两者结合用的情况会更多。

Hope this helps

Thanks