关于html+ashx开发中几个问题的解决方法 (转)

在跟html+ashx打交道的园友们肯定会发现,这种模式虽然优美,但在开发中会遇到一些难处理的地方。我也不例外,下面是自己在实际开发中总结出来的几条经验,希望跟大家分享,更希望得到大家的建议和更好的解决方法!

 

  问题1:用委托字典代替switch...case。

  这个问题是在处理请求时发现的,大家肯定也不愿意在自己的项目中建许多的handler来处理那么多的请求,于是就想到在一个handler里处理多个请求,ajax请求中都加一个action的参数,在handler里根据这个action做相应的处理或返回相应的数据,这里肯定没有人用if...else来判断action,大多数人都会想到用switch...case,一开始我也是用的switch,但渐渐地发现,每个case不像一个代码块,不能为其中的变量提供一个独立的作用域!用龙珠中孙悟空的话“真是伤脑筋”。

  在网上搜了一下,也有不少人遇到这个问题。有个解决方法是把每个处理单独成handler里一个方法,这样清楚明了,但在ProcessRequest方法中要用反射调用对应的方法!自己对这个解决办法不太满意,于是想到了委托,想到了字典,把反射调用方法变成在字典里索引委托。

  首先在handler里声明一个私有的静态委托字典:

  static  Dictionary < string , Func < string >>  hs;

  然后用handler(一般处理程序的类)里静态构造函数初始化hs,更重要的是要在静态构造函数里添加处理方法:

复制代码
  static  Handler() 
  {
    hs 
=   new  Dictionary < string , Func < string >> ();
    hs.Add(
" add " ,  delegate ()
    {
      
int  id  =   int .Parse(req( " id " ));
      
string  title  =  req( " title " );
      
return   " add " ;
    });
    hs.Add(
" update " ,  delegate ()
    {
      
int  id  =   int .Parse(req( " id " ));
      
string  title  =  req( " title " );
      
return   " update " ;
    });
  
}
复制代码

   最后就是在ProcessRequest方法里调用了:

  context.Response.ContentType  =   " text/plain " ;
  HttpRequest req 
=  context.Request;
  
string  action  =  req[ " action " ].ToLower();
  
string  result  =  hs[action]();
  context.Response.Write(result);

  这样便避免了switch...case的变量作用域问题和反射的效率问题。关于上面用到的req()方法,我的想法是把公共的东西用静态方法提供,如:

复制代码
   static   string  req( string  key)
  {
    
return  HttpContext.Current.Request[key];
  }
  
static   string  jss( object  obj)
  {
    JavaScriptSerializer JSS 
=   new  JavaScriptSerializer();
    
return  JSS.Serialize(obj);
  }
复制代码

  

  问题2:权限问题。

  你肯定不愿自己的数据在用户没有登陆或登陆过期后还可以继续访问。这里假设登陆的用户用Session["user"]来存储,当然在handler里判断一下Session["user"]是很简单的事情,但问题是你如何让Session["user"]为null时的用户跳转到指定页(这里假设是登陆页login.html)。哈哈,这时你会不会想到用context.Response.Redirect ("login.html")这样一句话来解决呢!我的第一反映是这样的,但分析一下,ajax是请求数据的,这样做是让ajax去请求login.html这个页面,得到的结果应该是login.html的源代码才对,分析是这样分析的,可还是不死心,还是测试了一下,结果正如分析的那样,login.html的源代码做为ajax请求结果返回了!

  其实,大家心理明白,有一个很简单的方法,就是在Session["user"]为null时返回一个特定值,这里假设"unlogin",然后在每次ajax请求完成后判断返回值是不是"unlogin"。

这方法很简单,也很可靠,但很笨,很麻烦,可行性不高。于是我又想到了jquery.ajaxSuccess(),想用它来做统一处理,在我想到它的时候我就有点儿担心,jquery会不会是先调用具体请求的回调函数然后再调用这全局的回调函数呢?我带着这个疑问做了测试,结果也如预料那样先执行具体请求的回调再执行全局回调!没法办,只好查jquery的源码了~。在没压缩的jquery-1.4.2.js里找到了success()这方法,果然如此,改顺序后如下:

复制代码
  function success() {  
     if  ( s. global  ) {
      trigger( 
" ajaxSuccess " , [xhr, s] );
    }            
    
//  If a local callback was specified, fire it and pass it the data
     if  ( s.success  &&  xhr.responseText != " unlogin "  ) {
      s.success.call( callbackContext, data, status, xhr );
    }
  }
复制代码

  执行顺序是改好了,可跳转的代码写哪呢?每个页面写一次?不不,这不是我们写程序的风格,思来想去,写到jquery文件里(最下面)是一个可行的方法:

$(document).ajaxSuccess( function (event,xhr,settings){
    
if (xhr.responseText == " unlogin " ){
        window.top.location.href
= " /login.html " ;
    }
})

  很显示,不是每个页面的ajax请求都要求用户登陆,比如login.html页,所以判断时要排除不用登陆的页面:

复制代码
  if  (HttpContext.Current.Request.UrlReferrer.ToString().ToLower().IndexOf( " login.html " ) <   0 )
  {
    
if  (HttpContext.Current.Session[ " user " ]  ==   null )
    {
      HttpContext.Current.Response.Write(
" unlogin " );
      HttpContext.Current.Response.End();
    }
  }
复制代码

 

  问题3:数据模板。

  真是什么东西需要,什么都东西就应运而生!在写这个随笔之前正好在园里看到了个jquery.tmpl的文章!tmpl的产生也正是解决这个问题的!我很自知这个方法没tmpl强大,但tmpl有一个问题没有解决,其实模板有两个主要的问题,1是如果模板存储在js里不好编辑,2是要把模板存储在哪里才方便设计时的视图呢!tmpl把模板存储在<script  type="text/x-jquery-tmpl"></script>标签中,应该说是解决了第一个问题,但我感觉第2个问题也是很重要的!想来想去,只能把模板直接存储在数据的容器标记里:

     < ul  id ="ulList" >
        
< li >< a  href ="somepage.html?id={ID}" > {Title} </ a >< br  />
            {Content}
</ li >
    
</ ul >

    把模板直接写在目标容器里,就像一条数据一样,美工调样式不是问题,程序加方法不是问题,这方法我看行!但js肯定不会直接操作这个模板吧,现在要做的就是把这个模板变成真的模板:

  $( function () {
    
var  ulList  =  $( " #ulList " );
    ulList.data(
" tpl " ,ulList.html()).empty();
  }

   把模板存储到容器的data里应该是再适当不过了,而且这个操作在页面加载完马上就做!然后把容器清空,让位给后来加载过来的真实数据。后台提供json数据,这个很简单:

复制代码
     public   class  News
    {
        
public   int  ID {  get ;  set ; }
        
public   string  Title {  get ;  set ; }
        
public   string  Content {  get ;  set ; }
    }
    
// handler里用了上面第一个问题的解决方法
  hs.Add( " getNews " ,  delegate ()
  {
    List
< News >  list  =   new  List < News > () 
    {  
      
new  News(){ ID = 1 ,Title = " title1 " ,Content = " Content1 " },
      
new  News(){ ID = 2 ,Title = " title2 " ,Content = " Content2 " },
      
new  News(){ ID = 3 ,Title = " title3 " ,Content = " Content3 " },  
    };
    
return  jss(list);
  });
复制代码

   前台取数据没什么好说的,这个很基本:

复制代码
    $.get( " Handler.ashx?n= "   +  Math.random(), { action:  " getNews "  },  function (data) {
        
var  list  =  $.parseJSON(data);
        
var  ul  =  $( " #ulList " );
        
var  html  =   "" ;
        
for  ( var  i  =   0 ; i  <  list.length; i ++ ) {
            html 
+=  ul.data( " tpl " ).format(list[i]);
        }
        ul.html(html);
    })
复制代码

   在填充数据的时候用了string.format这个方法,它在我js中的string.format  随笔里有记录,呵呵,这个我也没有想到,写format的时候让它支持json对象只是为了阅读方便,然而用到这如此合适!到这的时候我已兴奋不已了,测试结果如下:

  但当我加了事件后,我发现还不够好。如果在模板li里加上οnclick="show({ID},'{Title}')",IE里刚打开页面的时候就会有js错误,这是为什么呢?问题在这个ID参数上,因为{ID}被看作json对象了,而它却是一个格式不对的json!  提示js错误也正常,'{Title}'没有错误是原因这里看作字符串参数了。这个js错误虽然不影响程序,但没有人不喜欢自己写的代码是没有js错误的! 解决方法很简单,像Title参数一样加引号就可以了,如果show方法里真的要数字类型,只好在那里转换一下喽!不过你肯定会发现,很多时候是不用转换的,甚至你还希望它就是个字符串类型呢!

  从没有这么认真的写过随笔,三个星期就休息了这一下午,没陪女朋友,没睡大觉,没找朋友喝酒,却老老实实地把它完成了!

 

另加:取数据模板可写成函数

复制代码
function initTemplate(){
    $(".tplContainer").each( function() {  // 取出模板
        $( this).data("tpl", unescape($( this).html())).empty().removeClass("tplContainer");
    })

} 

复制代码

在容器里加.tplContainer{display:none},这样也不会加载时显示出模板了!

 

 

对于方法1,其实用switch case也是一样的,只要把case中的代码都提取为一个函数就可以了

string action = context.Request["action"];
 
string respText = string.Empty;
switch(action)
{
    case "action1":
       respText = DoAction1(context);
       break;
    default:
       break;
}
...

 

Ajax+HTML+ASHX实现文件异步上传 Ajax+HTML+ASHX实现文件异步上传 参考使用,可直接复制使用 立即下载

相关推荐

通用权限管理系统(html5+ashx+easyui)源码

一个很好的学习html5 easyui的入门源码

ashx跳转html页面,html执行.NET函数 html操作数据库 html与ashx结合

原文发布时间为:2009-09-30 —— 来源于本人的百度文章 [由搬家工具导入]html页面执行.NET函数 html与ashx的结合1、添加一般应用程序Handler.ashxusing System;using System.Web;public class Handler : IHttpHandler {public void ProcessRequest (HttpContext co...

weixin_42360778的博客 721

关于html+ashx开发中几个问题的解决方法

在跟html+ashx打交道的园友们肯定会发现,这种模式虽然优美,但在开发中会遇到一些难处理的地方。我也不例外,下面是自己在实际开发中总结出来的几条经验,希望跟大家分享,更希望得到大家的建议和更好的解决方法!

ashx 修改部分 html,关于html+ashx开发中几个问题的解决方法

问题1:用委托字典代替switch...case。这个问题是在处理请求时发现的,大家肯定也不愿意在自己的项目中建许多的handler来处理那么多的请求,于是就想到在一个handler里处理多个请求,ajax请求中都加一个action的参数,在handler里根据这个action做相应的处理或返回相应的数据,这里肯定没有人用if...else来判断action,大多数人都会想到用switch...c...

weixin_29011395的博客 273

html+ashx 表单提交示例

1,sumbit表单提交 WebForm1.aspx源码: 代码如下: <%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”WebForm1.aspx.cs” Inherits=”NETFormDemo.ashx.WebForm1″ %> <!DOCTYPE html> <html xmlns=”http://www.w3.org/1999/xhtml”> <head > <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/> <title></t

PLC与变频器联动控制:从开关量、模拟量到通讯的接线与编程实战

在工业自动化系统中,电机调速控制是核心需求之一,其关键在于实现可编程逻辑控制器(PLC)与变频器之间的可靠联动。其基本原理是通过PLC输出控制信号,由变频器接收并驱动电机按设定速度运行。这项技术的核心价值在于实现电机的软启停、精确调速与节能控制,广泛应用于风机、水泵、传送带及精密张力控制等场景。其中,开关量控制以其接线简单、抗干扰能力强的特点,成为基础且可靠的方案;而模拟量控制则能实现无级平滑调速,满足更高精度的工艺要求。本文以西门子、三菱等主流品牌为例,深入解析了这两种主流控制方式的硬件接线、参数设置与梯

1269

html通过一般处理程序ashx调用服务器

一般处理程序ashx的调用

weixin_41703489的博客 612

别再硬啃理论了!用Simulink双脉冲实验,5分钟搞懂MOSFET二极管反向恢复

本文通过Simulink双脉冲实验仿真,帮助电力电子学习者快速理解MOSFET二极管反向恢复特性。文章详细介绍了实验搭建步骤、关键参数配置及波形解析,将抽象理论转化为可视波形,大幅提升学习效率。特别适合需要直观理解反向恢复过程的工程师和学生。

weixin_30918633的博客 955

Html ashx比较mvc,介绍ASP.NET MVC5可能你不知道但很有用三个特性

今天介绍ASP.NET mvc5可能你不知道但很有用三个特性,分别是PreApplicationStartMethodAttribute、BuildProvider.RegisterBuildProvider和BuildManager.AddReferencedAssembly。一、PreApplicationStartMethodAttributePreApplicationStartMetho...

weixin_39747293的博客 273

MOSFET高频响应实战:如何用LTspice仿真内部电容效应(附模型文件)

本文深入解析MOSFET高频响应中的内部电容效应,通过LTspice仿真工具详细展示如何提取模型参数并优化高频特性。从栅极相关电容到结电容的物理本质,再到实战案例中的开关损耗分析和频率响应扫描,提供全面的设计优化方法,帮助工程师有效应对高速开关电路中的电容挑战。

weixin_33725722的博客 390

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 262

ashx PHP文件 优劣,关于html+ashx开发中几个问题的解决方法_jquery

> hs;然后用handler(一般处理程序的类)里静态构造函数初始化hs,更重要的是要在静态构造函数里添加处理方法:static Handler(){hs = new Dictionary>();hs.Add("add", delegate(){int id = int.Parse(req("id"));string title = req("title");return "add"...

weixin_42332131的博客 154

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 305

ashx是什么文件,如何创建[转]

原文地址:http://www.cnblogs.com/lin614/archive/2008/01/18/1044734.html   ashx是什么文件,如何创建 .ashx 文件用于写web handler的。其实就是带HTML和C#的混合文件。当然你完全可以用.aspx 的文件后缀。使用.ashx 可以让你专注于编程而不用管相关的WEB技术。.ashx必须包含IsReusabl...

weixin_33766805的博客 757

uniapp(安卓苹果APP端):解决video组件播放视频卡顿,视频一直加载非常缓慢或加载不出来解决方案,解决多个video组件视频播放很卡一直加载非常慢怎么办(无论真机调试还是本地测试都完美搞定)

uni-app APP端video组件播放视频卡顿,uniapp video app 加载不出来解决方案,uniapp app使用video视频播放卡顿,uni-app APP端video组件播放视频卡顿_uniapp video老是加载,uniapp开发app视频在真机上卡顿,安卓app播放视频很卡,苹果ios真机运行播放视频加载很慢怎么办,解决UniApp中MP4视频播放卡顿问题,解决m3u8视频播放很卡的问题,uniapp 使用video组件,部分视频加载非常慢,uniapp视频播放卡顿,安卓视频播放

✅ 精选推荐文章 7915

基于matlab的阈值分割的车牌定位识别系统

车牌自动识别模块是现代社会智能交通系统(ITS)的重要组成部分,是图像处理和模式识别技术研究的热点,具有非常广泛的应用。车牌识别主要包括以下三个主要步骤:车牌区域定位、车牌字符分割、车牌字符识别。本案例通过对采集的车牌图像进行灰度变换、边缘检测、腐蚀及平滑等过程进行车牌图像预处理,并由此得到一种基于车牌颜色纹理特征的车牌定位方法,最终实现了车牌区域定位。车牌字符分割是为了方便后续对车牌字符进行匹配,从而对车牌进行识别。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 969

ashx是什么文件,如何创建

ashx是什么文件,如何创建 C#   2009-04-06 18:11   阅读99   评论0   字号: 大大  中中  小小 大家做application的时候,会发现这样一个文件后缀ashx,在VS2005中Web应用程序项目模板里的Generic Handler 项里。ashx是什么:.ashx 文件用于写web handler的,说白了就是带H

thinker28754的专栏 1万+

科研神器: 用Gemini 3

Edge藏了个科研开挂神器!免TZ/免谷歌账号用Gemini 3,1分钟上手(附保姆级教程) 做科研查文献、理数据总卡壳?想蹭Gemini 3的AI能力,却被“谷歌账号+TZ+节点筛选”三连劝退? 现在不用折腾了!Edge浏览器里装个插件,直接把Gemini 3揣进口袋——**免翻墙、免谷歌账号、国内直接用**,分分钟让你的科研效率翻三倍,导师都得问你“偷偷开了啥挂”!

ZhangJiqun&191cm&85kg 1159

【B/S】你知道ashx 和ashx.cs

错误描述:通过html 和.ashx文件和三层的建立,查找一个数据库表 从报错的代码,就知道这个是ashx.cs文件的错; 经过核实F12查找,具体cuow错误: the server responded with a status of 500 (Internal Server Error) 也就是服务器没有传到信息500错误;就是没有执行ashxwen文件: 在执行的时候,先执行的...

邢美玲 1412

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Html ashx比较mvc,C# ashx与html的联合使用

本文将介绍ashx和html的联合使用方法,尽管目前流行mvc,但handler一般处理程序还是ASP.NET的基础知识,结合html页面,做出来的网页绝对比WebForm的简洁和效率高。首先,概要说明一下:html是过去非常老的一种网页格式,属于静态网页,要想在html上呈现SQL Server上的数据,只能依靠ashx了。大概的方法是,利用html作为模板,使用ashx读取数据库,替换html...

weixin_32259601的博客 395

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ashx文件

ashx是什么文件,如何创建 .ashx 文件用于写web handler的。其实就是带HTML和C#的混合文件。当然你完全可以用.aspx 的文件后缀。使用.ashx 可以让你专注于编程而不用管相关的WEB技术。.ashx必须包含IsReusable. 如下例所示using System; using System.Web;public class AverageHandler :

8alt的专栏 1449

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: Date的简单介绍
下一篇: CSS实现树形结构效果
weixin_34026276
博客等级 码龄11年 6372粉丝 1272原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值