aspx,ascx和ashx使用小结

做asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们,网上有很多文章介绍。“纸上得来终觉浅,绝知此事要躬行”,下面自己总结一下做个笔记。

1、.aspx

Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx 文件中创建。

2、.ascx

asp.net的用户控件,是作为一种封装了特定功能和行为(这两者要被用在Web应用程序的各种页面上)的Web页面被开发的。一个用户控件包含了html、代码和其他Web或者用户控件的组合,并在Web服务器上以自己的文件格式保存,其扩展名是*.ascx。asp.net里的缺省配置并不允许Web客户端通过url来访问这些文件,但是这个网站的其他页面可以集成这些文件里所包含的功能。

3、.ashx

前面两个都太熟悉了,这个才是要讲的重点。

(1)、使用举例

.ashx文件是主要用来写web handler的。使用.ashx 可以让你专注于编程而不用管相关的web技术。我们熟知的.aspx是要做html控件树解析的,.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不需要的。ashx必须包含IsReusable属性(这个属性代表是否可复用,通常为true),而如果要在ashx文件用使用Session必须实现IRequiresSessionState接口.

一个简单的实现修改登录用户密码的示例:

aspx,ascx和ashx使用小结 - dingtao-wgs - 程序员驿站Code

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Web.SessionState;

namespace Test

{

    public class HandlerTest : IHttpHandler, IRequiresSessionState

    {

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ClearContent();

            context.Response.ContentType = "text/plain";

            context.Response.Cache.SetCacheability(HttpCacheability.NoCache); //无缓存

            string action = context.Request.Params["action"]; //外部请求

            if (action == "modifyPwd") //用户改密码

            {

                string oldPwd = context.Request.Params["pwd"];

                //在ashx文件用使用Session必须实现IRequiresSessionState接口

                //Session["LogedUser"]是登录用户的会话,用户名和密码都是test

                if (oldPwd.ToUpper() != ((context.Session["LogedUser"]) as Customer).Password.ToUpper()) //用户输入的旧密码和当前登录用户的不相同

                {

                    context.Response.Write("旧密码输入错误!");

                }

                else

                {

                    context.Response.Write("旧密码输入正确!");

                }

            }

            context.Response.End();

        }

        public bool IsReusable

        {

            get

            {

                return true;

            }

        }

    }

}

客户端的调用(js和页面部分):

aspx,ascx和ashx使用小结 - dingtao-wgs - 程序员驿站Code

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ASHXTest.aspx.cs" Inherits="ASHXTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>mytest</title>

    <script type="text/javascript">

        function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }

        function createXMLHTTP() {

            var xmlHttp = false;

            var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",

                         "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",

                         "Microsoft.XMLHTTP"];

            for (var i = 0; i < arrSignatures.length; i++) {

                try {

                    xmlHttp = new ActiveXObject(arrSignatures[i]);

                    return xmlHttp;

                }

                catch (oError) {

                    xmlHttp = false; //ignore

                }

            }

            // throw new Error("MSXML is not installed on your system."); 

            if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {

                xmlHttp = new XMLHttpRequest();

            }

            return xmlHttp;

        }

        var xmlReq = createXMLHTTP();

        // 发送ajax处理请求(这里简单验证旧密码的有效性)

        function validateOldPwd(oTxt) {

            var url = "/HandlerTest.ashx?action=modifyPwd&pwd=" + escape(oTxt.value); //.ashx文件

            xmlReq.open("get", url, true);

            xmlReq.setRequestHeader("If-Modified-Since", "0");

            xmlReq.onreadystatechange = callBack;

            xmlReq.send(url); // 发送文本

        }

        function callBack() {

            if (xmlReq.readyState == 4) {

                if (xmlReq.status == 200) {

                    alert(xmlReq.responseText); // 接收文本

                }

                else if (xmlReq.status == 404) {

                    alert("Requested URL is not found.");

                } else if (xmlReq.status == 403) {

                    alert("Access denied.");

                } else

                    alert("status is " + xmlReq.status);

            }

        }

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <input id="txtOldPwd" type="text" οnblur="validateOldPwd(this)" />

    </div>

    </form>

</body>

</html>

分析:

a、以前我们通常都是通过一个简单的aspx文件实现的功能,其实通过ashx也可以。

笔者曾经写过的一篇ajax:数据传输方式简介,通过对比,我们发现aspx要将前后台显示和处理逻辑分开,所以就弄成了两个文件,其实,在最终编译的时候,aspx和cs还是会编译到同一个类中去.这中间就要设计html的一些逻辑处理;而ashx不同,它只是简单的对web http请求的直接返回你想要返回的结果.比aspx少处理了html的过程(但是ashx也可以处理html的一些逻辑,只是通常都不这么用)。理论上ashx比aspx要快。

b、还是在相同的旧文里,我们知道数据传输的几种方式,其实ashx都可以实现(修改ashx文件里context.Response.ContentType 即可),这里不再赘述了。

(2)、ashx特别适合于生成动态图片,生成动态文本(纯文本,json,xml,javascript等即可)等。

(3)、.ashx文件有个缺点:它处理控件的回发事件非常麻烦。处理数据的回发,通常都需要一些.aspx页的功能,只有自己手动处理这些功能(还不如直接建一个aspx文件来处理)。所以,一般使用.ashx输出一些不需要回发处理的项目即可。

4、总结

aspx-->P(Page)

ascx-->C(Control)

ashx-->H(HttpHandler)

当浏览器访问web服务器,我们最终接收到的还是html文本。浏览器通过渲染引擎解释这些标签,在屏幕上展现出可见的效果。而asp.net不过就是我们应用的一种平台技术来"变相"解释html的,说白了它就是为了提高生产率,它的技术术语再多,本质上还是html范畴内的东西(如果你不通过那些动态页面技术完全利用html和浏览器(当然包括js)技术来实现动态页面效果,那么你会发现效果有了代码量也相当可观).所以说web开发的底层就是一堆的html标签,无论是asp.net还是jsp都是对html某种方式的包装,是html的产物。


转载于:https://www.cnblogs.com/yefengmeander/archive/2011/11/08/2887989.html

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

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

相关文章

vue3.x通过ref属性获取元素

在vue2.x中&#xff0c;可以通过给元素添加refxxx属性&#xff0c;然后在代码中通过this.$refs.xxx获取到对应的元素 然而在vue3中时没有$refs这个东西的&#xff0c;因此vue3中通过ref属性获取元素就不能按照vue2的方式来获取vue3需要借助生命周期方法&#xff0c;原因很简单…

vue3+TypeScript封装echarts5组件

https://blog.csdn.net/qq_38330707/article/details/111497853 有用mark 等抽时间写个vueTSecharts5.0的组件文章 写个大概 带 resize的 <template><div class"echarts" :id"id"></div> </template><script lang"ts&q…

How to Register COM in VS

在 Visual Studio .Net 部署项目中注册 COM 模块的步骤 将 COM 对象添加到 Visual Studio 部署项目。在解决方案资源管理器中&#xff0c;右键单击刚添加的模块&#xff0c;然后单击属性。注意&#xff1a;“属性”窗口包含一个表&#xff0c;其中有两列和 x 行&#xff08;行数…

css3 卡片hover3D效果

鼠标hover卡片 向上翻转&#xff0c;看简易代码 <!DOCTYPE html> <html> <head><title>3D Flip Card hover effects</title><style type"text/css">* {margin: 0;padding: 0;font-family: consolas;box-sizing: border-box;}bo…

随便贴两个漏洞,如 Apache JServ协议服务

1、Apache JServ协议服务 描述&#xff1a;Apache JServ协议&#xff08;AJP&#xff09;是一种二进制协议&#xff0c;可以将来自Web服务器的入站请求代理到 位于Web服务器后面的应用程序服务器。不建议在互联网上公开使用AJP服务。 如果AJP配置错误&#xff0c;可能会允许攻击…

vue3学习笔记 Composition API setup

一、Composition API优势 相对于vue2的option API Vue3的Composition API设计更有优势 Composition(组合式)Api 功能分组 Composition(组合式)Api 功能导入复用 组合式Api 所解决的问题 (1) 更好的代码组织结构 (2) 相同的代码逻辑可以进行复用 home.vue 3种方式递进升级…

【TCP传输数据-键盘录入】

package com.yjf.esupplier.common.test;import java.io.*; import java.net.Socket;/*** author shusheng* description TCP 传输数据:键盘录入* Email shushengyiji.com* date 2019/1/15 22:57*/ public class ClientDemo1 {public static void main(String[] args) throws I…

04

1、创建/guanli 目录&#xff0c;在/guanli下创建zonghe 和 jishu 两个目录&#xff08;一条命令&#xff09; [rootlocalhost ~]# mkdir /guanli [rootlocalhost ~]# touch /guanli/zonghe [rootlocalhost ~]# touch /guanli/jishu [rootlocalhost ~]# ls /guanlix 2、添加组帐…

事件冒泡 bubbles cancelBubble stopPropagation() stopImmediatePropagation() 区别

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>事件冒泡</title></head><body><h4>bubbles cancelBubble stopPropagation() stopImmediatePropagation() 区别</h4><input type"te…

vue2.0关于添加属性后视图不能更新的问题

属性赋值和this.$set 和vue.$set方法我不行 可以用 this.$delete来进行删除后在设置都可以了 转载于:https://www.cnblogs.com/zhouyideboke/p/11276299.html

vite2.1 最新alias别名设置方式

vite.config.js 别名配置 resolve.alias 类型&#xff1a; Record<string, string> | Array<{ find: string | RegExp, replacement: string }> 将会被传递到 rollup/plugin-alias 作为 entries 的选项。也可以是一个对象&#xff0c;或一个 { find, replacement …

Java生鲜电商平台-商城后台架构与原型图实战

Java生鲜电商平台-商城后台架构与原型图实战 说明&#xff1a;生鲜电商平台的运营平台&#xff0c;其中需要很多的功能进行管理。目前把架构与原型图实战分享给大家&#xff0c;希望对大家有用. 仪表盘/首页&#xff0c;简单统计&#xff0c;报表页&#xff0c;运营快捷口。实际…

antdesignvue upload vue3个人笔记待更新

remove点击移除文件时的回调&#xff0c;返回值为 false 时不移除。支持返回一个 Promise 对象&#xff0c;Promise 对象 resolve(false) 或 reject 时不移除。Function(file): boolean | Promise无 beforeUpload上传文件之前的钩子&#xff0c;参数为上传的文件&#xff0c;若…

logging模块和包

日志模块和包 logging logging模块简介 logging模块是记录我们软件的各种状态&#xff0c;还可以记录各种交易信息 其实每个软件都是有错误日志的,开发人员可以通过错误日志中的内容对他的程序进行修改 日志级别 import logginglogging.debug(调试debug) # DEBUG 10…

python软件开发规范

软件开发规范 什么是软件开发规范&#xff1f; 好的设计项目目录结构&#xff0c;就和编码风格一样&#xff0c;是每个程序员都有的风格&#xff0c;但是在流水化标准化作业过程中&#xff0c;个性和风格是 不被鼓励的。如果你去维护一个非常不好读的项目&#xff0c;虽然实现逻…

D3Vueecharts个人乱记

利用d3vue开发的一个网络拓扑图 https://copyfuture.com/blogs-details/20200710101052238h32wazjmcii49dr 一开始用的是echart画的。 根据https://gallery.echartsjs.com/editor.html?cxH1Rkt3hkb&#xff0c;成功画出简单的节点关系。 如图&#xff1a; 总结—— 【优…

vue中使用Vue-pdf在线预览

下载 npm i vue-pdf 引入(在所需要预览的页面) <script>import axios from axiosimport pdf from vue-pdfimport CMapReaderFactory from vue-pdf/src/CMapReaderFactory.js // 加载中文的包export default {components: {pdf},data () {return {numPages:&#xff0c;…

oracle 自定义 聚合函数

Oracle自定义聚合函数实现字符串连接的聚合 create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象 sum_string varchar2(4000), static function ODCIAggregateInitialize(v_self in out string_sum_obj) return number, --对象初始化 member func…

Vue3里的setup中使用vuex

useStore 这里我们可以直接从vuex 4.X中解构出useStore方法&#xff0c;就可以在setup中使用vuex的相关函数 template 使用$store <template><div><h2>{{ $store.state.count }}</h2><button click"increaseCount">点击</button…

JQ 取CHECKBOX选中项值

备忘录 $("[namecheckbox]:checked").each(function(){ alert((this).val()); }) ;转载于:https://www.cnblogs.com/showblog/archive/2010/09/13/1825099.html