一、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. ExtJS 4.2 业务开发(三)数据添加和修改

    接上面的船舶管理业务,这里介绍添加和修改操作. 目录 1. 添加操作 2. 修改操作 3. 在线演示 1. 添加操作 1.1 创建AddShipWindow.js 在业务中的view目录下创建一个Ad ...

  2. clr 元数据

    clr相关编译器编译生成的托管模块由四部分组成:PE32或32+头.clr头.元数据.IL代码. 元数据和IL代码完全对应,保持一致(:>)性. 元数据有很多用途: VS的智能感知,自动补全: ...

  3. MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)

    在2.1.栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟. 其实只要在NuGet中安装两个包(Microsoft. ...

  4. ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录

    升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...

  5. 在Asp.Net中操作PDF – iTextSharp - 使用表格

    使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并不会深入探讨表格,仅仅是提供一个使用iTextSharp生成表格的方法介绍 使用i ...

  6. FFmpeg 中AVPacket的使用

    AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...

  7. VisualStudio 2015 开启IIS Express可以调试X64项目

    现在项目开发时总有时需要在X64下开发,这样我们就需要IIS Express中调试.不要总是放在IIS中,在Attach这样好慢.   如果不设置直接调试X64的程序,我们有可能会受到以下类似的错误 ...

  8. REGEX例子

    作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式).这个程序像下 ...

  9. ABP(现代ASP.NET样板开发框架)系列之19、ABP应用层——审计日志

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之19.ABP应用层——审计日志 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  10. xcode8.1 插件失效的问题

    1,查看 Xcode 插件安装目录 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 鼠标点一下桌面, command+shi ...