一、ajax+ashx模式的缺点

    在web开发过程中,为了提高网站的用户体验,或多或少都会用到ajax技术,甚至有的网站全部采用ajax来实现,大量使用ajax在增强用户体验的同时会带来一些负面影响,比如:不利于seo;然而,对于asp.net来说,一般会采用ashx文件作为ajax调用的后台,这种情况下,每个ajax请求都会对应一个ashx页面,如果请求过多则会造成项目中有繁多的ashx文件,不利于管理与维护,那么怎样改善这种情况呢?

二、问题分析与改进(反射)

    通过分析发现,每个ajax调用ashx的步骤都是一样,都分为以下三步:
    1、解析请求中的用户数据
    2、处理用户请求
    3、返回处理结果
    这三个步骤中,第一和第三步对于每个请求来说都一样,只有第二部涉及到数据的具体处理,每个请求会有所不同,因此需要针对第二个方面进行改进。
    ashx文件的类作为一个Handler,它是继承于IHttpHandler接口的,在处理业务时,每个请求都会首先进入方法"ProcessRequest"中,为了减少ashx文件的数量,我们可以将同一模块中的操作放在一个ashx文件中进行处理,具体代码类似下面中这样:

public void ProcessRequest(HttpContext context)
{
// 1、解析请求参数,此处忽略
// 2、以下为具体处理方式
string returnString = string.Empty;
string methodName = context.Request.Form["methodName"];
switch(methodName)
case "GetData":
returnString = GetData();
break;
case "InsertNewRow"
returnString = InsertNewRow();
break;
.....等等多个case分支
default:
break;
// 3、向客户端返回结果
context.Response.Write(returnString);
}
    这种方式通过在用户请求中添加一个用来表明具体调用方法的参数,可以将同一模块中的操作全部放在一起,并通过switch语句进行判断,然后分别调用,这样可以减少一定数量的ashx文件。但是这种方式存在一个弊端,如果方法很多的话会造成switch语句出现大量的分支,并且每个ashx文件中都需要在ProcessRequest方法中进行相同业务逻辑判断,那么怎样将这些相同的行为进行改进呢?我们知道,请求中包含了需要调用的方法名,为了将这些方法的调用进行统一处理,显然我们可以利用反射。
    通过定义一个Handler基类,让其他所有的ashx类继承此Handler,具体的处理方法写在子类中,这样基类的功能就可以简化为如下形式:
    
//Handler基类中的方法,为所有的Handler子类的方法进行调度
public void ProcessRequest(HttpContext context)
{
// 1、解析请求参数,此处忽略其他参数的解析,仅获取方法名
string methodName = context.Request.Form["Action"];
// 2、以下为反射的具体处理方式
Type type = this.GetType();
Object[] params = new Objece[]; //方法参数,我们统一将context作为参数,以为用户数据都封装在其中
MethodInfo method = type.GetMethod(methodName);
string returnString = (string)method.Invoke(this,params);
// 3、向客户端返回结果
context.Response.Write(returnString);
}

public String GetRequest(HttpContext context, String paramName)
{
    if (context.Request[paramName] != null)
    {
        return context.Request[paramName].ToString();
    }

     return "";

}


 
然后,继承该Handler的子类只需要实现具体的处理方法即可,该基类可以统一为所有子Handler进行方法调度,再也不会出现可能会越来越臃肿的switch,该方式类似于mvc中的controller调度,通过action来进行判断
    下面是一个子Handler的示例:
/// <summary>
/// UserHandler 的摘要说明
/// </summary>
public class UserHandler : BaseHandler
{
/// <summary>
/// 用户登录处理
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public String Login(HttpContext context)
{
String strAccount = "";
String strPassword = "";
String strRet; try
{
//获取页面传值
strAccount = GetRequest(context, "Account");
strPassword = GetRequest(context, "Password"); if (strAccount != "" && strPassword != "")
{
//简单起见,仅返回传递过来的用户账号与密码
//在实际应用中利用传递过来的参数值调用业务逻辑层的方法来完成客户端的请求
strRet = String.Format("账号:{0},密码:{1}", strAccount, strPassword);
}
else
{
//返回提示信息
strRet = "未能正确获取参数!";
} return strRet;
}
catch (Exception ex)
{
throw ex;
}
} }
前台调用代码如下:
<script type="text/javascript">
$(document).ready(function () {
$("#btnLogin").click(function () {
var account;
var password; account = $("#txtUserName").val();
password = $("#txtPassword").val(); $.ajax({
type: "POST",
async: true,
url: "Handler/UserHandler.ashx",
dataType: "text",
data: { Action: "Login", Account: account, Password: password },
success: function (data) {
alert(data);
},
error: function (xhr) {
alert(xhr.statusText);
return false;
}
});
});
});
</script>
    至此,已经完成了ajax + ashx开发模式的改进,但是仍然存在一下两个问题:
    1、因为采用了ajax技术,所以在提交请求时需要手动封装表单中的数据,如果数据过多,封装过程比较繁琐
    2、在输出时需要大量拼接html字符串,这也是一个繁琐的活

三、ajax请求中表单数据的封装

    为了提高数据的封装效率,我们可以使用jquery.form.js插件,该插件提供了便利的操作,可以根据需要封装表单中的全部或者部分数据,使用起来十分简单。
,下面说一下UserControl的用法

四、利用UserControl进行html输出

    在ajax+ashx处理方式中,大部分情况下都需要进行html字符的拼接,这种拼接非常繁琐却又不得不做,如果是非常简短的字符串还倒可以,如果遇到大量数据的显示,恐怕单单这一项任务就够让人烦的了,这里我们可以利用用户控件(UserControl)来帮我们完成html的呈现,具体思路如下:
    定义一个视图控制器类(ViewManage),专门用来创建用户控件的实例和生成用户控件的html,该试图控制器内部主要通过定义一个空的Page类,然后将该用户控件加载到Page中创建其实例,然后将Page对象的整个生命周期运行一遍,并将结果html输出。
    通过用户控件输出html还不会影响页面的SEO,因为在客户端<a/>的href还是有效的
 

总结:

该开发模式在利用ajax的同时,采用 "控制器+反射" 的模式进行方法调度,利用form插件来进行表单数据封装,对于大数据量的输出利用"用户控件"进行html生成。
对于ajax与SEO,需要遵循以下几点:
1、AJAX、SEO同等重要,在同一个WEB项目中为他们各自选择合适的使用领域。
2、会员管理、帐户中心、购物车、后台管理等操作界面可以使用AJAX,以提高用户体验和UI交互。
3、网站前台展示的页面,如新闻内容、商品介绍、帮助、文档类页面,不要使用AJAX,以SEO为主。
4、当我们认清楚AJAX什么时候该用,什么时候不该用,一个网站的SEO与AJAX技术结合就变得很简单了。

一种开发模式:ajax + ashx + UserControl的更多相关文章

  1. ASP.Net的两种开发模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  2. java web学习总结(二十九) -------------------JavaBean的两种开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

  3. javaweb学习总结(二十一)——JavaWeb的两种开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

  4. 《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式

    作者:张博出处:http://yilin.cnblogs.com Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发 ...

  5. EF的四种开发模式

    EF提供了四种开发模式,具体如下:(转载)Code First(New DataBase) :在代码中定义类和映射关系并通过model生成数据库,使用迁移技术更新数据库.Code First(Exis ...

  6. APP的三种开发模式

    转载于http://pleasureswx123.github.io/2014/09/15/APP%E7%9A%84%E4%B8%89%E7%A7%8D%E5%BC%80%E5%8F%91%E6%A8 ...

  7. 咸鱼入门到放弃10--javaweb的两种开发模式

    (本篇是之前方法的综合使用,新东西不多,其中也涉及三层架构的问题.此处直接引用了大佬blog:https://www.cnblogs.com/xdp-gacl/p/3908610.html) SUN公 ...

  8. JavaWeb学习 (二十)————JavaWeb的两种开发模式

    一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示

  9. javaweb(二十一)——JavaWeb的两种开发模式

    一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示

  10. EntityFramework 学习 一 三种开发模式

    Entity Framework支持3种不同的开发方法 1.Code First 2.Model First 3.Database First Code First 使用Code First开发模式, ...

随机推荐

  1. HTML中上传与读取图片或文件(input file)----在路上(25)

    input file相关知识简例 在此介绍的input file相关知识为: 上传照片及文件,其中包括单次上传.批量上传.删除照片.增加照片.读取图片.对上传的图片或文件的判断,比如限制图片的张数.限 ...

  2. Ajax 概念 分析 举例

    Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...

  3. 通过 floating IP 访问 VIP - 每天5分钟玩转 OpenStack(126)

    前面我们是直接用 curl 测试 VIP,在更为真实的场景中通常会使用 floating IP 访问 VIP. 下面我们给 VIP 关联一个 floating IP,再进行测试. 访问 Project ...

  4. Android AndroidRuntime类

     AndroidRuntime类是安卓底层很重要的一个类,它负责启动虚拟机以及Java线程,AndroidRuntime类在一个进程中只有一个实例对象保存在全局变量,gCurRuntime中. 

  5. github入门到上传本地项目【网上资源整合】

    [在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...

  6. Dancing Links and Exact Cover

    1. Exact Cover Problem DLX是用来解决精确覆盖问题行之有效的算法. 在讲解DLX之前,我们先了解一下什么是精确覆盖问题(Exact Cover Problem)? 1.1 Po ...

  7. Ognl表达式基本原理和使用方法

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

  8. [转]thinkphp 模板显示display和assign的用法

    thinkphp 模板显示display和assign的用法 $this->assign('name',$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论 ...

  9. 跨域问题,前端主动向后台发送cookie

    跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同  http://www.baidu.com:80 和 https:/ ...

  10. 史上最全Windows版本搭建安装React Native环境配置

    史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...