整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

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接口.
一个简单的实现修改登录用户密码的示例:


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和页面部分):


<%@ 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" onblur="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的产物。

一、数据库设计

二、Model实体类

public class banqi_attach
  {
       public int id { get; set; }
       public string bqid { get; set; }
       public string file_name { get; set; }
       public string file_path { get; set; }
       public int file_size { get; set; }
       public DateTime create_time { get; set; }
       public DateTime update_time { get; set; }
  }

三、DAL数据访问层:注意涉及增加和根据id获取列表用于显示


//增加数据
       public int Add(Model.banqi_attach model)
      {
           StringBuilder strSql = new StringBuilder();
           strSql.Append("insert into banqi_attach(");
           strSql.Append("[bqid],[file_name] ,[file_path] ,[file_size],[create_time] )");
           strSql.Append(" values (");
           strSql.Append("@bqid,@file_name,@file_path,@file_size,@create_time)");
           strSql.Append(";select @@IDENTITY");
           SqlParameter[] parameters = {
            new SqlParameter("@bqid", SqlDbType.NVarChar,20),
                               new SqlParameter("@file_name", SqlDbType.NVarChar,50),
                               new SqlParameter("@file_path", SqlDbType.NVarChar,100),
                               new SqlParameter("@file_size", SqlDbType.Int),
                               new SqlParameter("@create_time", SqlDbType.DateTime)
                                            };
           parameters[0].Value = model.bqid;
           parameters[1].Value = model.file_name;
           parameters[2].Value = model.file_path;
           parameters[3].Value = model.file_size;
           parameters[4].Value = model.create_time;

           //添加主表数据
           object obj = new SqlHelper().ExecuteScalar(strSql.ToString(), parameters, CommandType.Text);

           model.id = Convert.ToInt32(obj);
           return model.id;
      }

      //根据bqid 显示附件列表
       public DataTable GetList(string bqid)
      {
           StringBuilder strSql = new StringBuilder();
           strSql.Append("select * from banqi_attach where bqid='"+bqid+"'");
           return new SqlHelper().ExecuteQuery(strSql.ToString(), CommandType.Text);
      }

四、前台页面:包含一些对上传文件基本属性的验证,如类型、大小等


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="banqi_attach.aspx.cs" Inherits="Peixun.Web.banqi_attach" %>
<!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>班期附件</title>
  <style type="text/css">
      *{margin:0;padding:0;}
a{text-decoration:none;}
ul.imglist{ margin:0 auto; overflow:hidden;}
ul.imglist li{list-style:none; float:left; padding:14px 8px; width:280px; margin-bottom:20px; }
ul.imglist li img{ display:block; width:280px; height:200px}
ul.imglist li span{ display:block;width:100%; height:30px; line-height:30px; background:#F6F6F6;text-align:center;text-decoration: none;}
.part{ margin:0 auto; width:1200px;}
</style>
<link rel="stylesheet" href="./css/xadmin.css">
   <script src="https://libs.baidu.com/jquery/1.3.2/jquery.min.js" type="text/javascript"> </script>
   <script src="js/ajaxfileupload.js" type="text/javascript"></script>
</head>
<body>
<div class="part">
   <form id="form1" runat="server">
  附件名称:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
        <div class="layui-upload">
          <asp:FileUpload ID="FileUpload" runat="server" />
            <input type="button" value="上传图片 " class="layui-btn layui-btn-danger" onclick="ajaxFileUpload()"/>
           <br /><br />
           <div  style="border: 1px solid blue;">
               <img alt="" class="layui-upload-img" id="demo1" style=" width:300px; height:200px;">
               <asp:Label ID="demoText" runat="server"></asp:Label>
              <asp:HiddenField ID="HiddenField1" runat="server" />
              <asp:HiddenField ID="HiddenField2" runat="server" />
           </div>
       </div>
   <asp:Button ID="btnSubmit" runat="server" Text="确定上传" CssClass="layui-btn"  onclick="btnSubmit_Click" />
</div>

<!--图片列表-->
 <asp:Repeater ID="rptList2" runat="server">
 <HeaderTemplate>
<div class="part">
 <h3>附件列表</h3>
<ul class="imglist"> 
 </HeaderTemplate>
   <ItemTemplate>
    <li>
       <a href="<%#Eval("file_path")%>" target="_blank">
          <img src=<%#Eval("file_path")%> />
          <span><%#Eval("file_name")%><br /><%#Eval("create_time")%></span>
       </a>
   </li> 
  </ItemTemplate>
 <FooterTemplate>
    <%#rptList2.Items.Count == 0 ? "<div align=\"center\" style=\"font-size:12px;line-height:30px;color:#666;\">暂无记录</div>" : ""%>
   </ul>
 </div>
 </FooterTemplate>

 </asp:Repeater>
 <!--/图片列表-->

</div>
   </form>
<script type="text/javascript">
   function ajaxFileUpload() {
       var filePath = $("#FileUpload").val();
       if (filePath == "") {
           alert("请选择文件");
      }
       var size = $("#FileUpload")[0].files[0].size; //获取文件大小,单位字节B
       alert(size);

       var type = filePath.substr(filePath.indexOf("."));   //获取扩展名,格式如.jpg
       if (type == ".jpg" || type == ".gif" || type == ".JPG" || type == ".GIF") {
           alert("符合要求格式");
      }
       else {
           alert("格式错误");
      }
       
       $.ajaxFileUpload(
                  {
                      url: 'ajaxupload.ashx',            //需要链接到服务器地址
                      secureuri: false,
                      fileElementId: 'FileUpload',          //文件选择框的id属性
                      dataType: 'json',                                     //服务器返回的格式,可以是json
                      success: function (data, status)            //相当于java中try语句块的用法
                      {
                          $("#demo1").attr("src", "../upload/" + data.savefilename + "");
                          $("#demoText").html(data.msg);
                          $("#HiddenField1").val("/upload/" + data.savefilename);
                          $("#HiddenField2").val(data.filesize);

                      },
                      error: function (data, status, e)            //相当于java中catch语句块的用法
                      {
                          alert(data.error);
                      }
                  }

              );

  }
</script>

</body>
</html>

五、异步处理ashx文件


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Peixun.Web
{
   /// <summary>
   /// ajaxupload 的摘要说明
   /// </summary>
   public class ajaxupload : IHttpHandler
  {

       public void ProcessRequest(HttpContext context)
      {
           string msg = string.Empty;
           string error = string.Empty;
           string result = string.Empty;

           HttpPostedFile _upfile = context.Request.Files["FileUpload"];
           string savepath = HttpContext.Current.Server.MapPath("~") + "\\upload\\";
           int file_size = _upfile.ContentLength;  //获取上传文件大小
           //判断上传文件夹是否存在,若不存在,则创建
           if (!System.IO.Directory.Exists(savepath))
          {
               System.IO.Directory.CreateDirectory(savepath); //创建文件夹
          }
           if (_upfile.FileName != "")
          {
               //string savefilename = System.DateTime.Now.ToString("yyyyMMddHHmmssffff") + "_" + _upfile.FileName;//声称文件名,以时间命名防止重复
               string savefilename = System.DateTime.Now.ToString("yyyyMMddHHmmssffff") + _upfile.FileName.Substring(_upfile.FileName.IndexOf(".")).ToLower(); //注意Substring和IndexOf的写法中的大小写,获取扩展名并小写。
               _upfile.SaveAs(savepath + savefilename);
               msg = "文件上传成功!";
               result = "{msg:'" + msg + "',savefilename:'" + savefilename + "',filesize:'"+file_size.ToString()+"'}";
          }


           else
          {
               error = "文件上传失败!";
               result = "{ error:'" + error + "'}";
          }
           context.Response.Write(result);
           context.Response.End();

      }

       public bool IsReusable
      {
           get
          {
               return false;
          }
      }
  }
}

六、页面后台代码


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

namespace Peixun.Web
{
   public partial class banqi_attach : System.Web.UI.Page
  {
       protected void Page_Load(object sender, EventArgs e)
      {
           DataTable dt = new DAL.banqi_attach().GetList( Request.QueryString["bqid"]);
           rptList2.DataSource = dt;
           rptList2.DataBind();


      }
       #region 增加操作=================================
       private bool DoAdd()
      {
           bool result = false;
           Model.banqi_attach model = new Model.banqi_attach();
           model.file_name = TextBox1.Text.Trim();
           model.file_path = HiddenField1.Value;
           model.create_time = DateTime.Now;
           model.bqid = Request.QueryString["bqid"];
           model.file_size =Convert.ToInt32(HiddenField2.Value);
          if (new DAL.banqi_attach().Add(model) > 0)
          {
               result = true;
          }

           return result;
      }
       #endregion

       //保存
       protected void btnSubmit_Click(object sender, EventArgs e)
      {
           if (!DoAdd())
          {
               Response.Write("<script>alert('错误!');</script>");
               return;
          }
           else
          {
               Response.Write("<script>alert('上传成功!');var index = parent.layer.getFrameIndex(window.name);parent.layer.close(index); parent.location.reload(); </script>");
          }
      }
  }
}

七、效果图

、源码描述
1、前端:EasyUI、JQuery请求处理流程:html界面发起ajax请求 -> 调用ashx -> 调用存储过程(或SQL) -> 返回Json -> html界面
二、功能介绍
用于维护系统常用的基础数据,增量不大、或者变更不频繁的数据都可以维护在这里。如:
1、订单类型:生产、试制、DUMMY等
2、返工原因:来料不良、制程不良、人为操作、设备原因等
3、点检项目:外观、温度、湿度等

1、后台表介绍:
基础数据包含两张表:基础数据头表、和行表。头表用来保存基础数据类别,字段包含:基础数据类别、类别描述、是否系统参数、创建人、创建日期、更新人和更新日期行表用来保存具体的基础数据,字段包含:参数值、参数描述、扩展字段、创建人、创建日期、更新人和更新日期
2.、操作介绍:
步骤一:打开“基础数据维护”界面,先维护“基础数据类别”
步骤二:选中步骤一维护的类别,点击“查看参数行”按钮,来维护该类别的具体基础数据
步骤三:修改、删除
三、注意事项
1、开发环境为Visual Studio 2015,数据库为SQLServer2008,使用.net 4.0开发。

MES,制造执行系统,生产管理系统,企业网站|行业软件|企业应用,Asp.net源码|- 51Aspx.com

http://www.51aspx.com/code/codename/64900