一、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文件中进行处理,具体代码类似下面中这样:

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

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

     return "";

}

  1.  
 
然后,继承该Handler的子类只需要实现具体的处理方法即可,该基类可以统一为所有子Handler进行方法调度,再也不会出现可能会越来越臃肿的switch,该方式类似于mvc中的controller调度,通过action来进行判断
    下面是一个子Handler的示例:
  1. /// <summary>
  2. /// UserHandler 的摘要说明
  3. /// </summary>
  4. public class UserHandler : BaseHandler
  5. {
  6. /// <summary>
  7. /// 用户登录处理
  8. /// </summary>
  9. /// <param name="context"></param>
  10. /// <returns></returns>
  11. public String Login(HttpContext context)
  12. {
  13. String strAccount = "";
  14. String strPassword = "";
  15. String strRet;
  16.  
  17. try
  18. {
  19. //获取页面传值
  20. strAccount = GetRequest(context, "Account");
  21. strPassword = GetRequest(context, "Password");
  22.  
  23. if (strAccount != "" && strPassword != "")
  24. {
  25. //简单起见,仅返回传递过来的用户账号与密码
  26. //在实际应用中利用传递过来的参数值调用业务逻辑层的方法来完成客户端的请求
  27. strRet = String.Format("账号:{0},密码:{1}", strAccount, strPassword);
  28. }
  29. else
  30. {
  31. //返回提示信息
  32. strRet = "未能正确获取参数!";
  33. }
  34.  
  35. return strRet;
  36. }
  37. catch (Exception ex)
  38. {
  39. throw ex;
  40. }
  41. }
  42.  
  43. }
前台调用代码如下:
  1. <script type="text/javascript">
  2. $(document).ready(function () {
  3. $("#btnLogin").click(function () {
  4. var account;
  5. var password;
  6.  
  7. account = $("#txtUserName").val();
  8. password = $("#txtPassword").val();
  9.  
  10. $.ajax({
  11. type: "POST",
  12. async: true,
  13. url: "Handler/UserHandler.ashx",
  14. dataType: "text",
  15. data: { Action: "Login", Account: account, Password: password },
  16. success: function (data) {
  17. alert(data);
  18. },
  19. error: function (xhr) {
  20. alert(xhr.statusText);
  21. return false;
  22. }
  23. });
  24. });
  25. });
  26. </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. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  2. .NET Core的日志[5]:利用TraceSource写日志

    从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...

  3. 深入理解CSS六种颜色模式

    前面的话 赏心悦目的颜色搭配让人感到舒服,修改元素颜色的功能让人趋之若鹜.但颜色规划不当,会让网站用户无所适从.颜色从<font color="">发展至今,保留了很多 ...

  4. 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第十二节)

    好的,那么在上一节中呢,评论功能的后台已经写好了,这一节,先把这部分后台代码和前台对接一下. 1.评论功能实现 我们修改一下保存评论按钮的点击事件,用jQuery的方式获取文本框中的值,然后通过aja ...

  5. PAT练习题目录

    点题号就能查看题解了,另外代码也放在了开源中国码云上: 甲级:代码集合:https://git.oschina.net/firstmiki/PAT-Advanced-Level-Practise 10 ...

  6. Kotlin类:功能更强、而更简洁(KAD 03)

    作者:Antonio Leiva 时间:Dec 7, 2016 原文链接:http://antonioleiva.com/classes-kotlin/ Kotlin类尽可能简单,这样用较少的代码完成 ...

  7. 换个角度看微信小程序[推荐]

    去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...

  8. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  9. 【AI开发第一步】微软认知服务API应用

    目录 介绍 API分类 使用‘视觉’API完成的Demo 点击直接看干货 介绍 从3月份Google家的阿尔法狗打败韩国围棋冠军选手李世石,到之后微软Build2016大会宣布的“智能机器人”战略.种 ...

  10. JavaScript面向对象

    理解对象 对象这个词如雷贯耳,同样出名的一句话:XXX语言中一切皆为对象! 对象究竟是什么?什么叫面向对象编程? 对象(object),台湾译作物件,是面向对象(Object Oriented)中的术 ...