理想的 ASP.NET AJAX (Part 1 - Client Centric)

怎样的AJAX才算是理想?

要说什么是理想的ASP.NET AJAX,就要先说说什么是理想的AJAX。事实上AJAX最不理想的地方在于search engine friendly以及bookmarkable,这两个问题有一定的相似性,要解决并不难,只是每一个系统中实现起来都不一样,因此难以提出一个统一的patterns来解决。

首先说说search engine friendly这一点吧,实际上使用了AJAX的站点有很多信息是搜索引擎无法索引到的,因为页面上部分的信息是在用户进行操作后才显示的,显示的这些信息有可能是固定的也有可能是经过XHR(XMLHttpRequest)查询服务器后动态显示的。如果是固定信息,那么在生成页面时就要考虑这些信息是否也应该输出为静态HTML。那么什么情况下该输出为静态HTML而什么情况下不该输出为静态HTML呢?我觉得应该看隐藏的内容是否就是页面语义的一部分。例如页面用于显示一张集体照,当鼠标指向照片上不同人物时将显示他们的姓名和有关的介绍,那么这些信息就应该输出为静态HTML了,因为它们是页面信息的重要组成部分,并且这些信息应该被搜索引擎索引到。

当然,事情并非任何时候都那么简单,有时候我们并不能简单判断某些信息是否应该属于一个页面,或者说一个URL。例如你使用一个页面来展示你的gallery,但并非一下子显示所有的照片,开头显示随机的10张图片,然后允许用户输入/选择tag来显示对应的照片,如果当前显示的照片超过10张还会自动分页。这时候怎么办呢?整个gallery输出的一个静态页包括所有的照片以及描述?这看起来不太可行。假如你的gallery有100个tag和1000张照片,同时这一个页面成功被搜索引擎索引了,用户通过搜索引擎来到gallery页,他怎么找到搜索引擎上匹配的图片以及对应的描述?他根本不可能知道他要找的信息藏在哪里了,100个tag中可能只有几个能让他想找的信息显示出来。

这时候比较好的做法就是将tag分离出来变成独立的页面,或者说是URL。gallery首页上的tag对于用户来说是交互式按钮,在不刷新的情况下直接筛选对应的照片;但对于搜索引擎来说那是链接,链接到代表该筛选状态的页面,并且在该页面上才索引到照片和描述。这样当用户点击特定的搜索结果是,进入的是已经筛选了的gallery结果页,也就必然能看到他搜索命中的信息。同时这也增加了bookmarkable的可能性,因为一个URL已经不仅仅代表一个页面,而代表一个页面的特定状态,因此状态变得bookmarkable。然而这时候普通的筛选结果还不是bookmarkable的,因为在进行根据tag筛选后URL是不会被改变的,因此我们必须通过JavaScript改变URL才能让页面变得bookmarkable。

与理想的距离有多远?

我们面临最大的问题就是URL与状态的对应,以及有关的存取。我们希望每一个indexable & bookmarkable的状态都对应一个URL,而且最好是meaningful的URL。好吧,我们先舍弃meaningful这一点来探讨状态问题,实际上我们已经有一些方法来保存状态。例如ASP.NET提供的ViewState就是一个很好的例子。很多ASP.NET的新手可能会觉得要理解如何正确使用ViewState并不容易,其实它就是用于保存view的state的。整台计算机其实也就是一个state machine,不过我们当前所关注的是与view有关的state,所以称之为ViewState。ASP.NET开头的策略是在服务器端处理一切,所以发明了ViewState并尝试让状态在客户端仅作持久不作修改。然而我们需要的正好是相反的,我们需要一个在客户端能修改的状态,并且以URL作为持久的方式。

首先,我们不可能好像ASP.NET保存ViewState那样保存数据到URL当中。即使我们舍弃了meaningful,ViewState的容量还是会超过URL的长度限制,因此希望好像ASP.NET那样每一个控件各自汇报自己的ViewState然后页面负责统一持久到URL是难以实现的。(当然,在ASP.NET AJAX中尝试一下这样的实现也未尝不可,虽然其提供的控件少之又少。)

既然我们不能够好像ASP.NET保存ViewState那样“放肆”地利用URL进行持久,那么我们就必须针对特定的应用来考虑持久的方式,这正是无法开发一个通用框架实现此功能的原因。例如上面所说的gallery,我们要人为的考虑使用tag作为区分view的一个状态参数,接着我们可能还要考虑当用户选中多个view之后会发生什么事,是不是简单的在URL里面叠加多个tag呢?例如gallery.html#fun+event的样子?那么它和gallery.html#event+fun是等效的,而两个URL会不会导致PageRank的分散呢?之后又如何加上分页参数呢?这一切问题不是没有答案,而是它们的答案都太具针对性了,因此不具有通用性,难以做成一个可复用的框架实现。

因此我们在这里能做到的最多就如ASP.NET Futures或者别的框架提供的history功能那样,提供一个有限容量的string空间给你,你要自己决定如何把状态转换为string然后提交给它保存,之后它保你实现跨浏览器的Permanent URL和history支持。

到此为止,我们站在client centric的角度讨论了AJAX现在面临的一些重要障碍,以及潜在的解决方案。下一part我们将从server centric的角度来继续研究这个问题,并探讨ASP.NET是否能在AJAX方面做得更好,又或者是别的Microsoft技术。继续关注本文章系列,欢迎订阅Cat in Chinese(feed)或Cat in dotNET(feed)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT 发布程序到开发板

设置 IP 与开发板同一网段 设置一个device 设置开发板平台的 kit , 选择 device 设备为刚刚设置好的 pro 文件加入代码设置远程发布安装路径 INSTALLS target target.path /root/home/ftp5. 重新qmake工程完成设置 6. 是程序可以在板上运行, 之前这里一直…

Hibernate(十):n-n关联关系

背景:在实际开发中我们会遇到表的多对多关联,比如:一篇博客文章,它可以同时属于JAVA分类、Hibernate分类。 因此,我们在hibernate的学习文章系列中,需要学会如何使用hibernate来实现多对多的关联关系。 在h…

扫描器scanner的源代码

扫描器scanner的源代码&#xff0c;应该说是比较粗糙的 .#define szSign "500 13\r\nServer: Microsoft-IIS/5.0"//根据此标志来检查目标是否有漏洞 其实就是个取Banner。我那他改造了一下。有空检查一下效果如何&#xff1a;&#xff09; #include <stdio.h>…

QT 开发基于高德智感 ITA SDK 的红外模组应用

QT 开发基于高德智感 ITA SDK 的红外模组应用 1.把创建的工程 .pro 文件打开&#xff0c;在文本编辑区域点击鼠标右键弹出操作选项框&#xff0c; 点击 “Add Libraray…” 2.选择“External Libraray ”, 点击 “Next” 3.在弹出框点击选择Linux Platform, Library Type 选…

webpack第一节(4)

每次修改了代码都需要重新手动打包&#xff0c;这样很麻烦&#xff0c;不符合webpack的初衷&#xff0c;我们查看webpack帮助看看有没有可以自动运行的方法 输入 webpack -help 可以发现有个 --watch方法 它的解释是监听系统文件改变 我们试一试 现在监听进程一直在运行 我们改…

T.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflectio

There is no getter for property named * in class java.lang.String&#xff0c;此错误之所以出现&#xff0c;是因为mybatis在对parameterType"String"的sql语句做了限制&#xff0c;假如你使用<when test"username ! null">这样的条件判断时&…

【新媒体】现阶段新闻聚合的玩法

郑昀 20070824<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />新浪科技主编曹增辉的《新闻聚合的门槛》论及了玩聚所处的一些大环境之先天不足&#xff0c;主要是环境门槛、细分市场的门槛&#xff0c;以及入口问题。我的理解呢…

VS2015 + Qt +Ubuntu 交叉编译环境搭建教程

VS2015 Qt Ubuntu 交叉编译环境搭建教程 准备材料&#xff1a; VS2015 专业版 Qt5.7.1 VC Linux 插件工具 Vmware Ubnutu虚拟机 第1步&#xff1a;先安装 VS2015 选择 VC 开发&#xff0c; 选择安装 windows SDK kit 最新版本 第2步&#xff1a;安装 VC_Linux 插件 第3步…

1 java开发工具IDEA的使用

IntelliJ IDEA 2017.1汉化破解版安装图文教程(附汉化补丁) 注册码:http://idea.lanyus.com/ 点击在线生成 IntelliJ IDEA 2017.1正式版发布了&#xff0c;在新增功能方面值得关注的亮点有对Java 9的支持&#xff0c;以及对 Spring Data 支持的改进。在增强功能上&#xff0c;除…

[转]权限树中Checkbox的操作[Asp.Net2.0]

转自:http://jeffamy.cnblogs.com/archive/2006/06/17/428387.html原文如下:这里使用asp.net2.0的TreeView控件结合JavaScript实现权限树的部分功能。假设权限树中有如下三条规则&#xff1a;1、该节点可以访问&#xff0c;则他的父节点也必能访问&#xff1b;2、该节点可以访问…

java -XX:+PrintFlagsInitial该命令可以查看所有JVM参数启动的初始值

java -XX:PrintFlagsInitial 该命令可以查看所有JVM参数启动的初始值 [Global flags]intx ActiveProcessorCount -1 {product}uintx AdaptiveSizeDecrementScaleFactor 4 …

DVP 接口时钟配置错误导致的高温出图异常

我们sensor 在常温下出图正常&#xff1b; 但是在高温测试的时候&#xff0c;会出现花屏 继续升温画面就变为一个色&#xff0c;其实这个时候 sensor 计算的电压幅值已经饱和 将DVP 时钟改为 12MHZ 后OK&#xff0c; 软件处理是按照12MHZ 没有一点问题&#xff0c; 与客户确认也…

6.8

1、数组和函数concat将参数列表连接到原数组后面形成一个新的数组并返回&#xff0c;原有数组不受影响。 var arr ["a","b","c"];var arr1 arr.concat("d","e");//arr1 ["a","b","c",&quo…

影视资料

影视资料栏目属于一把刀实用查询大全的娱乐类别。中国最大的影视资料数据库和影人明星数据库&#xff0c;囊括包括中国、中国香港、中国台湾、美国、日本、韩国、英国等全球数十个国家的电影、电视资料及相关海报、剧照。转载于:https://blog.51cto.com/65000/41062

VA Code编写html(1)

<html><head><title>my webside</title><!--win‘/’注释行--><!--防止中文乱码在head中添加如下代码--><meta charset"utf-8"><body><!--<img src"image/1.jpg" alt"未找到图片">加载…

Handling Errors Exceptionally Well in C++ 在C++中良好地捕获意外的错误

Handling Errors Exceptionally Well in C在C中良好地捕获意外的错误from:http://www.cprogramming.com/tutorial/exceptions.htmlauthor:unknown翻译&#xff1a;范晨鹏One benefit of C over C is its exception handling system. An exception is a situation in which a pr…

MFC 使用 Picture control 显示图片和数据流

一、使用现有的图片文件显示在 界面 picture 控件 在MFC picture 加载bitmap 图片方法图片可以是从资源文件夹来的&#xff0c;也可以是文件路径等CBitMap 载入图像接口 有两种方式 BOOL LoadBitmap(LPCTSTR lpszResourceName); // 资源文件名 BOOL LoadBitmap(UINT nIDResour…