.ashx文件中输出文件的问题

yuxh81 2010-08-06 02:37:37
想点击导出按钮,实现将数据导出为excel,于是做了一个.ashx文件(用于接收导出请求,并执行导出)

toexcel.ashx代码

...

DataSet ds1 = Member.GetMembers();//获取要导出的数据

context.Response.Clear();
context.Response.Charset = "";
context.Response.ContentType = "application/vnd.ms-xls";
StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

DataGrid dg = new DataGrid();
dg.DataSource = ds1;
dg.DataBind();
dg.RenderControl(htmlWrite);
context.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode("abcdefg.xls"));
context.Response.Write(stringWrite.ToString());
context.Response.End();


这段代码如果在服务器按钮事件中写,则可以成功导出excel文件,但在这里
却只输出了一个页面,里面包含了ds1里的所有数据,外加一个“确定”按钮!

不知怎么回事,请指教!
...全文
1494 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
pingjing_82 2013-04-09
  • 打赏
  • 举报
回复
我也正遇到这样的问题,有谁可以解决一下。
qfjzr 2012-07-13
  • 打赏
  • 举报
回复
悲剧了!!
csdnfan 2011-11-24
  • 打赏
  • 举报
回复
唉啊,遇到相同的问题可惜还没有找到答案,这个框架貌似是extjs
yuxh81 2010-08-13
  • 打赏
  • 举报
回复
晕,要沉了
yuxh81 2010-08-12
  • 打赏
  • 举报
回复
别沉了,自己顶!
yuxh81 2010-08-11
  • 打赏
  • 举报
回复
没有哪位兄弟这样做过吗?

千万别沉了啊!
专爆菜鸟 2010-08-10
  • 打赏
  • 举报
回复
正在研究如梦的下载的4个方法。
yuxh81 2010-08-10
  • 打赏
  • 举报
回复

可是可以,不过我觉得应该可以不产生文件而直接输出下载

事实证明,如果不用ajax请求导出excel,而直接在页面的服务器事件中处理导出(不产生文件)是可以的!
wilensky 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yuxh81 的回复:]

引用 20 楼 glyphvectory 的回复:

lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新


谢谢你,不然就沉了!

如果是这样的话,怎么监测用户已下载完成呢?
也就是说删除文件的时机问题。。。
这个似乎办不到吧!!!
[/Quote]
我做下载到出这类,都是建个temp文件夹,用户点击下载的时候,先看看有没有指定文件名的文件,没有则生成,有则直接下载,或者数据有更新了,生成覆盖再下载。

你可以搞个定时删除,夜里12点,不过存几个临时文件,也占不了多大地方
yuxh81 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 glyphvectory 的回复:]

lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新
[/Quote]

谢谢你,不然就沉了!

如果是这样的话,怎么监测用户已下载完成呢?
也就是说删除文件的时机问题。。。
这个似乎办不到吧!!!
GlyphVectory 2010-08-10
  • 打赏
  • 举报
回复
lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新
yuxh81 2010-08-09
  • 打赏
  • 举报
回复
接收并处理ajax请求的页面statistics.ashx


<%@ WebHandler Language="C#" Class="statistics" %>

using System;
using System.Web;
using System.Data;
using Newtonsoft.Json;
using System.IO;
using System.Web.SessionState;

public class statistics : IHttpHandler,IRequiresSessionState {

public void ProcessRequest (HttpContext context) {
string opertype = context.Request.QueryString["opertype"];

SessionLogin login = context.Session["Login"] as SessionLogin;

//...

if (opertype == "contactrecordtoexcel") //导出到excel
{
if (login != null)
{
ContactRecordStatisticsOption thisOption = new ContactRecordStatisticsOption();

//-------------------获取查询参数执行查询,并导出Excel文件

//所属员工所在部门ID
string did = context.Request.QueryString["did"];
if (!string.IsNullOrEmpty(did)) { thisOption.Did.IsUsed = true; thisOption.Did.Value = did; }
else thisOption.Did.IsUsed = false;

//联系人姓名
string linkman = context.Request.QueryString["linkman"];
if (!string.IsNullOrEmpty(linkman)) { thisOption.Linkman.IsUsed = true; thisOption.Linkman.Value = linkman; }
else thisOption.Linkman.IsUsed = false;

//所属操作员ID
thisOption.Oid.IsUsed = true;
thisOption.Oid.Value = login.Id;

//所属企业用户ID
thisOption.Cid.IsUsed = true;
thisOption.Cid.Value = login.Cid;


//-----------------------导出逻辑
string[] columns = { "cname", "cfrom", "clevel", "industry", "recordtime" };

DataSet ds = Statistics.ContactRecord(thisOption);
DataSet ds1 = new DataSet();
ds1.Tables.Add(new DataTable());

for (int j = 0; j < columns.Length; j++)
{
LabelCustomize label = new LabelCustomize();
ds1.Tables[0].Columns.Add(label.GetLabel(1, "TB_CLIENT", columns[j]));
}

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow row = ds1.Tables[0].NewRow();
for (int j = 0; j < columns.Length; j++)
{
row[j] = ds.Tables[0].Rows[i][columns[j]];
}
ds1.Tables[0].Rows.Add(row);
}

//调用导出方法
Tools.ToExcel(ds1, "Excel文件.xls");
}
else
{
context.Response.Write("False");
}
}
}

public bool IsReusable {
get {
return false;
}
}

}


下载方法,Tools.ToExcel(ds1, "Excel文件.xls");


HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.ContentType = "application/vnd.ms-xls";
StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

DataGrid dg = new DataGrid();
dg.DataSource = ds;
dg.DataBind();
dg.RenderControl(htmlWrite);
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(fname));
HttpContext.Current.Response.Write(stringWrite.ToString());
HttpContext.Current.Response.End();
yuxh81 2010-08-09
  • 打赏
  • 举报
回复
aspx页面之html部分:


<div style="float:left;width:100%;">
<div style="width:100%;float:left;">
<table style="width:100%;" class="form">
<tr>
<td style="text-align:left;">
<asp:Label ID="lblDepartment" runat="server" Text="所属部门"></asp:Label> <select id="selDepartment" style="width:125px;"></select> 
<asp:Label ID="lblOwner1" runat="server" Text="所属员工"></asp:Label> <select id="selOwner" style="width:125px;"><option value="">[全部]</option></select> 
<asp:Label ID="lblOperator1" runat="server" Text="我方人员"></asp:Label> <select id="selOperator" style="width:125px;"></select> 
<asp:Label ID="lblLinkman1" runat="server" Text="联 系 人"></asp:Label> <input id="txtLinkman" type="text" style="width:120px;" />
</td>
</tr>
<tr>
<td style="text-align:left;">
<asp:Label ID="lblContactTime1" runat="server" Text="联系时间"></asp:Label> <select id="selContactTimeMode">
<option value="">[全部]</option>
<option value="today" selected="selected">今天</option>
<option value="thisweek">本周</option>
<option value="thismonth">本月</option>
<option value="thisquarter">本季度</option>
<option value="thisyear">本年</option>
</select>
<span>从</span>
<input id="txtContactTimeStart" type="text" style="width:100px;" />
<span>到</span>
<input id="txtContactTimeEnd" type="text" style="width:100px;" /> 
<asp:Label ID="lblNextContactTime1" runat="server" Text="下次联系"></asp:Label> <select id="selNextContactTimeMode">
<option value="">[全部]</option>
<option value="today" selected="selected">今天</option>
<option value="thisweek">本周</option>
<option value="thismonth">本月</option>
<option value="thisquarter">本季度</option>
<option value="thisyear">本年</option>
</select>
<span>从</span>
<input id="txtNextContactTimeStart" type="text" style="width:100px;" />
<span>到</span>
<input id="txtNextContactTimeEnd" type="text" style="width:100px;" />
</td>
</tr>

<tr>
<td style="text-align:left;">
<input id="rdoIsFactAll" type="radio" style="cursor:pointer;" name="isfact" checked="checked" />全部客户
<input id="rdoIsFactNo" type="radio" style="cursor:pointer;" name="isfact" />潜在客户
<input id="rdoIsFactYes" type="radio" style="cursor:pointer;" name="isfact" />事实客户
<input id="btnStatis" type="button" value=" 统 计 " class="button" />
</td>
</tr>

</table>
</div>
<div style="width:100%;float:left;">
<table style="width:100%; height:100%;">
<tr>
<td style="vertical-align:top;" colspan="2">
<table id="tbContactRecords" width="100%" class="data" style="margin-top:0px;">
<thead>
<tr>
<th style="width:15%;"><asp:Label ID="lblClientName" runat="server" Text="客户名称"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblLinkman" runat="server" Text="联 系 人"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblOperator" runat="server" Text="我方人员"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblContactTime" runat="server" Text="联系时间"></asp:Label></th>
<th style="width:25%;"><asp:Label ID="lblContent" runat="server" Text="联系内容"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblMode" runat="server" Text="联系方式"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblOwner" runat="server" Text="所属员工"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblRecordTime" runat="server" Text="记录时间"></asp:Label></th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="8" style="text-align:center;">没有符合条件的联系记录!</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr style="height:18px;">
<td style="text-align:left;">
共<label id="lblReCount" style="color: Red;"></label>条记录 第<label id="lblCurrPgIndex"
style="color: Red;"></label>/<label id="lblPgCount" style="color: Red;"></label>页
<a id="btnPrev" href="javascript:prevPage();" style="color:#0099dd;">上一页</a> <a id="btnNext" href="javascript:nextPage();" style="color:#0099dd;">
下一页</a>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</td>
<td style="text-align:right;">
<input id="btnExport" type="button" class="button" value=" 导 出 " onclick="toexcel($(this));" />
</td>
</tr>
</table>
</div>
</div>
yuxh81 2010-08-09
  • 打赏
  • 举报
回复
以下是.aspx页面代码:

js部分:

<script type="text/javascript">
//js获取页面url中的参数
var search=window.location.search;
var pList = getSearchAsArray(search);

//------查询逻辑

var p_did = "";
var p_linkman = "";
var p_operator = "";
var p_sid = "";
var p_contacttimestart = "";
var p_contacttimeend = "";
var p_nextcontacttimestart = "";
var p_nextcontacttimeend = "";
var p_isfact = "";

//设置查询参数
function set_parms()
{
p_did = $("#selDepartment").val();
//...
}

//获取查询结果记录总数
function getRecordCount(btn)
{
$("#tbContactRecords tbody tr").remove();

btn.attr("disabled","disabled");
$.ajax({
url:"../../Ajax/statistics.ashx?opertype=contactrecord&"+Math.random(),
type:"GET",
data:{did:p_did,linkman:p_linkman,operator:p_operator,sid:p_sid,contacttimestart:p_contacttimestart,contacttimeend:p_contacttimeend,
nextcontacttimestart:p_nextcontacttimestart,nextcontacttimeend:p_nextcontacttimeend,isfact:p_isfact},
beforeSend:function(){
var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center'><div class='info'>正在统计个数……</div></td></tr>");
$("#tbContactRecords").append($msg);
},
success:function(data)
{
btn.attr("disabled","");
currRecordCount = data;
//计算参数
currPageIndex = 1;
currPageCount = parseInt(currRecordCount / currPageSize);if (currRecordCount % currPageSize > 0) currPageCount += 1;//总页数

//首次自动触发
getpage($("#btnNext,#btnPrev,#btnPageTo,#btnNext1,#btnPrev1,#btnPageTo1"));
},
error:function(XMLHttpRequest,textStatus)
{
btn.attr("disabled","");
alert("请求错误:"+textStatus);
return false;
}
});
}
//------分页逻辑
var currRecordCount = 0; //总记录数
var currPageSize = 20; //页面记录数
var currPageCount = parseInt(currRecordCount / currPageSize);if (currRecordCount % currPageSize > 0) currPageCount += 1;//总页数
var currPageIndex = 1; //全局变量,当前页码,初始为第1页

var oldPageIndex; //分页前的页码,以方便查询失败时还原

//重新计算分页数据(由于页面大小或记录数改变)
function initPageData()
{
//重新计算总记录数、总页数
currPageIndex = 1;
currPageCount = parseInt(currRecordCount / currPageSize);
if (currRecordCount % currPageSize > 0) currPageCount += 1;
}

//下一页
function nextPage()
{
if(currPageIndex>=currPageCount) return;
oldPageIndex = currPageIndex;//备份页码
currPageIndex++;
getpage($("#btnNext,#btnNext1"));
}
//上一页
function prevPage()
{
if(currPageIndex<2) return;
oldPageIndex = currPageIndex;//备份页码
currPageIndex--;
getpage($("#btnPrev,#btnPrev1"));
}

//设置页面大小
function setPageSize(sel)
{
var n = parseInt(sel.val());
currPageSize = n;
initPageData();
getpage($("#btnNext,#btnPrev,#btnPageTo,#btnNext1,#btnPrev1,#btnPageTo1"));
}

//设置控件状态
function setstatus()
{
if(currRecordCount<=0)
{
var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center;'>没有符合条件的联系记录!</strong></td></tr>");
$("#tbContactRecords").append($msg);
currPageIndex=0;
}
if(currPageIndex<=1) $("#btnPrev,#btnPrev1").attr("disabled","disabled");
else $("#btnPrev,#btnPrev1").attr("disabled","");
if(currPageIndex>=currPageCount) $("#btnNext,#btnNext1").attr("disabled","disabled");
else $("#btnNext,#btnNext1").attr("disabled","");
$("#btnPageTo,#btnPageTo1").attr("disabled","");
//加载页面信息
$("#lblReCount,#lblReCount1").text(currRecordCount);
$("#lblCurrPgIndex,#lblCurrPgIndex1").text(currPageIndex);
$("#lblPgCount,#lblPgCount1").text(currPageCount);
$("#selPageSize,#selPageSize1").val(currPageSize);
}

//处理分页
function getpage(btn)
{
btn.attr("disabled","disabled");
//备份原来的数据
var $trList = $("#tbContactRecords tbody tr");

$("#tbContactRecords tbody tr").remove();

$.ajax({
url:"../../Ajax/statistics.ashx?opertype=contactrecordpaging&"+Math.random(),
data:{did:p_did,linkman:p_linkman,operator:p_operator,sid:p_sid,contacttimestart:p_contacttimestart,contacttimeend:p_contacttimeend,
nextcontacttimestart:p_nextcontacttimestart,nextcontacttimeend:p_nextcontacttimeend,isfact:p_isfact,pageIndex:currPageIndex,pageSize:currPageSize},
beforeSend:function(){
var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center'><div class='info'>正在加载……</div></td></tr>");
$("#tbContactRecords").append($msg);
},
success:function(data)
{
json=eval('('+data+')');
//加载数据
$("#tbContactRecords tbody tr").remove();
$.each(json,function(i,item){
var $tr = $("<tr onmousemove='$(this).addClass(\"MouseOver\");' onmouseout='$(this).removeClass(\"MouseOver\");'></tr>");//var $tr = $("<tr onmousemove='$(this).css(\"background-color\",\"#edf7fb\");' onmouseout='$(this).css(\"background-color\",\"#FFFFFF\");'></tr>");
var $td_clientname = $("<td>"+item['cname']+"</td>");
var $td_linkman = $("<td>"+item['linkman']+"</td>");
var $td_operator = $("<td>"+item['operator']+"</td>");
var $td_contacttime = $("<td>"+item['contacttime']+"</td>");
var $td_content = $("<td>"+item['content']+"</td>");
var $td_mode = $("<td>"+item['cmode']+"</td>");
var $td_owner = $("<td>"+item['rename']+"</td>");
var $td_recordtime = $("<td>"+item['recordtime']+"</td>");
$("#tbContactRecords tbody").append($tr);
$("#tbContactRecords tbody tr").eq(i).append($td_clientname).append($td_linkman).append($td_operator).append($td_contacttime).append($td_content).append($td_mode).append($td_owner).append($td_recordtime);
});
//设置分页控件状态
setstatus();
},
error:function(XMLHttpRequest,textStatus)
{
alert("请求错误:"+textStatus);
//还原数据
$("#tbContactRecords tbody tr").remove();
$("#tbContactRecords tbody").append($trList);
currPageIndex=oldPageIndex;
return false;
}
});
}


//------业务逻辑

//导出为excel
function toexcel(btn)
{
//$("#tbContactRecords tbody tr").remove();
var fname = "yuxh.xls";
var columns = "cname,recordtime";

//btn.attr("disabled","disabled");
$.ajax({
url:"../../Ajax/statistics.ashx?opertype=contactrecordtoexcel&"+Math.random(),
type:"GET",
data:{did:p_did,linkman:p_linkman,operator:p_operator,sid:p_sid,contacttimestart:p_contacttimestart,contacttimeend:p_contacttimeend,
nextcontacttimestart:p_nextcontacttimestart,nextcontacttimeend:p_nextcontacttimeend,isfact:p_isfact,toexcel_fname:fname,toexcel_columns:columns},
beforeSend:function(){
//var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center'><div class='info'>正在导出,请稍候……</div></td></tr>");
//$("#tbContactRecords").append($msg);
},
success:function(data)
{
//alert(data);
},
error:function(XMLHttpRequest,textStatus)
{
btn.attr("disabled","");
alert("请求错误:"+textStatus);
return false;
}
});
}

$("#btnStatis").click(function(){
set_parms();
//执行查询
getRecordCount($(this));
});
});
</script>
SK_Aqi 2010-08-09
  • 打赏
  • 举报
回复
使用ajax应该也可以
或许这里dg.RenderControl(htmlWrite);
不能导出,毕竟应该是页面呈现的控件才可以导吧
所以加之楼上的拼datatable方法结合你的方法实现吧
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yuxh81 的回复:]
即,用ajax导出excel文件
[/Quote]

看不懂这是什么意思。给个浏览器端代码看看,什么叫做“用ajax导出excel文件”呢?
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yuxh81 的回复:]
别误会了,我想用ajax导出数据(所以并不只是一个简单的下载链接,会有数据的查询及最后的输出下载)!
[/Quote]
ajax读取导出数据,可你的代码怎么跟“"attachment;filename”扯上关系的呢?你的ajax不就是要得到一段html代码吗?难道你的“ajax导出”跟文件发生了关系?
yuxh81 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kkbac 的回复:]

直接写一个aspx页面,之后把这个代码复制过去,之后做一个链接就可以了.


下载和ajax貌似是没啥联系的, 难道我out了.
[/Quote]

别误会了,我想用ajax导出数据(所以并不只是一个简单的下载链接,会有数据的查询及最后的输出下载)!
yuxh81 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zmcici 的回复:]

下载本来就不会刷新页面,不知你用AJAX的用意是什么
[/Quote]

用服务器的Button不会刷新吗?

对于导出功能,我并不是为了无刷新而去无刷新,因为我使用的ajax查询和分页

由于导出要再次查询,而查询条件均是js变更存放在前端
所以如果是服务器Button则无法获取这些查询条件,也就无法导出!
骑猪看海 2010-08-07
  • 打赏
  • 举报
回复
下载本来就不会刷新页面,不知你用AJAX的用意是什么
加载更多回复(9)
第4章 ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET,能够使用面向对象的思想和软件开发的一些思想,例如封装、派生、继承以及高级的设计模式等。本章首先介绍ASP.NET最重要的概念---网页代码模型。 4.1 ASP.NET的网页代码模型 在ASP.NET应用程序开发,微软提供了大量的控件,这些控件能够方便用户的开发以及维护。这些控件具有很强的扩展能力,在开发过程无需自己手动编写。不仅如此,用户还能够创建自定义控件进行应用程序开发以扩展现有的服务器控件的功能。 4.1.1 创建ASP.NET网站 在ASP.NET,可以创建ASP.NET网站和ASP.NET应用程序,ASP.NET网站的网页元素包含可视元素和页面逻辑元素,并不包含designer.cs文件。而ASP.NET应用程序包含designer.cs文件。创建ASP.NET网站,首先需要创建网站,单击【文件】按钮,在下拉菜单选择【新建网站】选项,单击后会弹出对话框用于ASP.NET网站的创建,如图4-1所示。 图4-1 新建ASP.NET网站 在【位置】选项,旁边的【下拉菜单】可以按照开发的需求来写,一般选择文件系统,地址为本机的本地地址。语言为.NET网站使用的语言,如果选择Visual C#,则默认的开发语言为C#,否则为Visual Basic。创建了ASP.NET网站后,系统会自动创建一个代码隐藏页模型页面Default.aspx。ASP.NET网页一般由三部分组成,这三个部分如下所示。 q 可视元素:包括HTML,标记,服务器空间。 q 页面逻辑元素:包括事件处理程序和代码。 q designer.cs页文件:用来为页面的控件做初始化工作,一般只有ASP.NET应用程序(Web Application)才有。 ASP.NET页面包含两种代码模型,一种是单文件页模型,另一种是代码隐藏页模型。这两个模型的功能完全一样,都支持控件的拖拽,以及智能的代码生成。 4.1.2 单文件页模型 单文件页模型的所有代码,包括控件代码、事物处理代码以及HTML代码全都包含在.aspx文件。编程代码在script标签,并使用runat=“server”属性标记。创建一个单文件页模型,在【文件】按钮选择【新建文件】选项,在弹出对话框选择【Web窗体】或在右击当前项目,在下拉菜单选择【添加新建项】选项即可创建一个.aspx页面,如图4-2所示。 图4-2 创建单文件页模型 在创建时,去掉【将代码放在单独的文件】复选框的选择即可创建单文件页模型的ASP.NET文件。创建后文件会自动创建相应的HTML代码以便页面的初始化,示例代码如下所示。 <%@ Page Language=“C#” %> <script runat=“server”> 无标题页
编译并运行,即可看到一个空白的页面被运行了。ASP.NET单文件页模型在创建并生成时,开发人员编写的类将编译成程序集,并将该程序集加载到应用程序域,并对该页的类进行实例化后输出到浏览器。可以说,.aspx页面的代码也即将会生成一个类,并包含内部逻辑。在浏览器浏览该页面时,.aspx页面的类实例化并输出到浏览器,反馈给浏览者。ASP.NET单文件页模型运行示例图如图4-3所示。 图4-3 单文件页模型 4.1.3 代码隐藏页模型 代码隐藏页模型与单文件页模型不同的是,代码隐藏页模型将事物处理代码都存放在cs文件,当ASP.NET网页运行的时候,ASP.NET类生成时会先处理cs文件的代码,再处理.aspx页面的代码。这种过程被成为代码分离。 代码分离有一种好处,就是在.aspx页面,开发人员可以将页面直接作为样式来设计,即美工人员也可以设计.aspx页面,而.cs文件由程序员来完成事务处理。同时,将ASP.NET的页面样式代码和逻辑处理代码分离能够让维护变得简单,同时代码看上去也非常的优雅。在.aspx页面,代码隐藏页模型的.aspx页面代码基本上和单文件页模型的代码相同,不同的是在script标记的单文件页模型的代码默认被放在了同名的.cs文件,.aspx文件示例代码如下所示。 <%@ Page Language=“C#” AutoEventWireup=“true” CodeFile=“Default.aspx.cs” Inherits=“_Default” %> 无标题页
从上述代码可以看出,在头部声明的时候,单文件页模型只包含Language=“C#”,而代码隐藏页模型包含了CodeFile=“Default.aspx.cs”,说明被分离出去处理事物的代码被定义在Default.aspx.cs,示例代码如下所示。 using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; //使用HtmlControls using System.Web.UI.WebControls; //使用WebControls using System.Web.UI.WebControls.WebParts; //使用WebParts public partial class _Default : System.Web.UI.Page //继承自System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } } 上述代码为Default.apx.cs页面代码。从上述代码可以看出,其格式与类库、编写类的格式相同,这也说明了.aspx页面允许使用面向对象的特性,如多态、继承等。但是ASP.NET代码隐藏页模型的运行过程比单文件页模型要复杂,运行示例图如图4-4所示。 图4-4 代码隐藏页模型 上述描述了代码隐藏类模型的页面生成模型。当页面被呈现之前,ASP.NET应用程序会解释并编译相应的cs文件的代码,与此同时,ASP.NET应用程序还会将.aspx页面进行编译并生成.aspx页面对应的类。生成.aspx页面对应的类后会将该类与cs文件的类进行协调生成新的类,该类会通过IIS在用户浏览页面时呈现在用户的浏览器。 4.1.4 创建ASP.NET Web Application ASP.NET网站有一种好处,就是在编译后,编译器将整个网站编译成一个DLL(动态链接库),在更新的时候,只需要更新编译后的DLL(动态链接库)文件即可。但是ASP.NET网站却有一个缺点,编译速度慢,并且类的检查不彻底。 相比之下,ASP.NET Web Application不仅加快了速度,只生成一个程序集,而且可以拆分成多个项目进行管理。创建Application,首先需要新建项目用于开发Web Application,单击菜单栏上的【文件】按钮,在下拉菜单选择【新建项目】选项,在弹出窗口选择【ASP.NET应用程序】选项,如图4-5所示。 图4-5 创建ASP.NET应用程序 在创建了ASP.NET应用程序后,系统同样会默认创建一个Default.aspx页面,不同的是,多出了一个Default.aspx.designer.cs,用来初始化页面控件,一般不需要修改。 4.1.5 ASP.NET网站和ASP.NET应用程序的区别 在ASP.NET,可以创建ASP.NET网站和ASP.NET应用程序,但是ASP.NET网站和ASP.NET应用程序开发过程和编译过程是有区别的。ASP.NET应用程序主要有以下特点: q 可以将ASP.NET应用程序拆分成多个项目以方便开发,管理和维护。 q 可以从项目和源代码管理排除一个文件或项目。 q 支持VSTS的Team Build方便每日构建。 q 可以对编译前后的名称,程序集等进行自定义。 q 对App_GlobalResources 的Resource强类支持。 ASP.NET WebSite编程模型具有以下特点: q 动态编译该页面,而不用编译整个站点。 q 当一部分页面出现错误不会影响到其他的页面或功能。 q 不需要项目文件,可以把一个目录当作一个Web应用来处理。 总体来说,ASP.NET网站适用于较小的网站开发,因为其动态编译的特点,无需整站编译。而ASP.NET应用程序适应大型的网站开发、维护等。 4.2 代码隐藏页模型的解释过程 在ASP.NET的代码隐藏页模型,一个完整的.aspx页面包含两个页面,分别是以.aspx和.cs文件为后缀的文件,这两个文件在形成了整个Web窗体。在编译的过程都被编译成由项目生成的动态链接库(.DLL),同时,.aspx页面同样也会编译。但是与.cs页面编译过程不同的是,当浏览者第一次浏览到.aspx页面时,ASP.NET自动生成该页的.NET类文件,并将其编译成另一个.DLL文件。 当浏览者再一次浏览该页面的时候,生成的.DLL就会在服务器上运行,并响应用户在该页面上的请求或响应,ASP.NET应用程序的解释过程图如4-6所示。 图4-6 代码隐藏页模型页面的执行过程 在客户端浏览器访问该页面时,浏览器会给IIS发送请求消息,IIS则会开始执行ASP.NET编译过程,如果不存在编译过后的DLL文件,则加载编译的类并创建对象。当创建对象完成,生成创建对象后的代码并生成一个ASPX页面代码,该页面代码反馈给IIS,IIS再反馈成HTML页面的形式给客户端。 4.3 代码隐藏页模型的事件驱动处理 在传统的ASP开发,ASP的事件都是按照网页的顺序来处理的,一般情况下,ASP页面的事件都是从上到下处理事件,可以说ASP的开发是一个线性的处理模型。在用户的浏览操作,每一次用户的操作都会导致页面重新被发送到服务器。因此,重复的操作必然导致客户端和服务器的往返过程,服务器必须重新创建页面,当创建页面后,服务器再按照原来的从上到下的顺序进行事件处理。 在ASP.NET,通过使用模拟事件驱动模型的行为代替了ASP的线性处理模型。ASP.NET页框架模型隐式的为用户建立了事件和事件处理程序的关联。ASP.NET让用户可以为从浏览器传递的事件在服务器代码设置相应的处理程序。假设某个用户正在浏览网站并与页面之间产生了某种交互,用户的操作就会引发事件,事件通过HTTP被传输到服务器。在服务器,ASP.NET框架解释信息,并触发事件与之对应的处理程序。该程序可以是.aspx页面的处理程序,也可以是开发者自定义的类库,或者COM组件等。事件驱动处理如图4-7所示。 图4-7 页面框架的事件驱动处理模型 上图则说明了当一个浏览者通过浏览器触发ASPX页面时,浏览器、服务器和服务器返回页的过程。 4.4 ASP.NET客户端状态 Web开发不像软件开发,Web应用实际上是没有状态的,这就说明Web应用程序不自动指示序列的请求是否来自相同的浏览器或客户端,也无法判断浏览器是否一直在浏览一个页面或者一个站点,也无法判断用户执行了哪个操作并统计用户的喜好。 4.4.1 视图状态 从上面的章节可以知道,当服务器每次的往返过程,都将销毁页面并重新创建新的页面。如果一个页面的信息超出了页面的生命周期,那么这个页面的相关信息就不存在了。如果注销了页面的信息,那么用户的一些信息可能就不存在了。 在ASP.NET,网页包含视图状态来保存用户的信息,视图状态在页面发回到自身时,跨页过程存储和用户自己的页面的特定值,视图状态的优点如下所示。 q 不需要任何服务器资源。 q 在默认情况下,对控件启用状态的数据进行维护,不会被破坏。 q 视图状态的值经过哈希运算和压缩保护,安全性更高。 视图状态同样有一些缺点,缺点如下所示。 q 视图状态会影响性能,如果页面存储较大较多的值,则性能会有较大的影响。 q 在手机,移动终端上,可能无法保存视图状态使用的值。 q 视图状态虽然安全性较高,但是还是有风险,如果直接查看页面代码,可以看到相应代码。 4.4.2 控件状态 ASP.NET还提供了控件状态属性作为在服务器往返过程存储自定义控件的数据的方法。在页面控件,如果有多个自定义控件使用多个不同的控件来显示不同的数据结构,为了让这些页面控件能够在在页面上协调的工作,则需要使用控件状态来保护控件,同时,控件状态是不能被关闭的。同样,控件状态也有它的优点,优点如下所示。 q 与视图状态相同的是,不需要任何服务器资源。 q 控件状态是不能被关闭的,提供了控件管理的更加可靠的方法。 q 控件状态具有通用性。 4.4.3 隐藏域 在ASP,通常使用隐藏域保存页面的信息。在ASP.NET,同样具有隐藏域来保存页面的信息,作为维护页面状态的一种形式,但是隐藏域的安全性并不高,最好不要在隐藏域保存过多的信息。隐藏域具有以下优点。 q 不需要任何服务器资源。 q 支持广泛,任何客户端都支持隐藏域。 q 实现简单,隐藏域属于HTML控件,无需像服务器控件那样有需要编程知识。 而隐藏域具有一些不足,如下所示。 q 具有较高的安全隐患。 q 存储结构简单。 q 同样,如果存储了较多的较大的值,则会导致性能问题。 q 如果隐藏域过多,则在某些客户端被禁止。 q 隐藏域将数据存储在服务器上,而不存储在客户端。 注意:如果开发,页面的隐藏域过多,这些隐藏域被存储在服务器。当客户端浏览页面的时候,会有一些防火墙扫描页面,以保证操作系统的安全,如果页面的隐藏域过多,那么这些防火墙可能会禁止页面的某些功能。 4.4.4 Cookie Cookie在客户端用户保存网站的少量的用户信息,服务器可以通过编程的方法获取用户信息,Cookie信息和页面请求通常一起发送到服务器,服务器对客户端传递过来的Cookie信息做处理。通常Cookie保存用户的登录状态、用户名等基本信息等等,在后面的章节会详细介绍使用ASP.NET操作Cookies。 4.4.5 客户端状态维护 虽然使用某些客户端状态并不使用服务器资源,但是这些状态都具有潜在的安全隐患,如Cookie。非法用户可以使用Cookie欺骗来攻击网站进行用户信息的获取,不过使用客户端状态能够使用客户端的资源从而提高服务器性能。使用客户端状态,虽然有安全隐患,但是具有良好的编程能力,以及基本的安全知识,能够较好的解决安全问题,同时也能够提高服务器性能。下面小结了一些客户端状态的优缺点。 q 视图状态:推荐当存储少量挥发到自身的页面的信息时使用。 q 控件状态:不需要任何服务器资源,控件状态是不能被关闭的,提供了控件管理的更加可靠和更通用的方法。 q 隐藏域:实现简单,但是在应用程序会造成一些安全隐患。 q Cookie:实现简单,同样也能够简单的获取用户的信息,但是Cookie有大小的限制,不适宜存储大量的代码。 4.5 ASP.NET页面生命周期 ASP.NET页面运行时,也同类的对象一样,有自己的生命周期。ASP.NET页面运行时,ASP.NET页面将经历一个生命周期,在生命周期内,该页面将执行一系列的步骤,包括控件的初始化,控件的实例化,还原状态和维护状态等,以及通过IIS反馈给用户呈现成HTML。 ASP.NET页面生命周期是ASP.NET非常重要的概念,了解ASP.NET页面的生命周期,就能够在合适的生命周期内编写代码,执行事务。同样,熟练掌握ASP.NET页面的生命周期,可以开发高效的自定义控件。ASP.NET生命周期通常情况下需要经历几个阶段,这几个阶段如下所示。 q 页请求:页请求发生在页生命周期开始之前。当用户请求一个页面,ASP.NET将确定是否需要分析或者编译该页面,或者是否可以在不运行页的情况下直接请求缓存响应客户端。 q 开始:发生了请求后,页面就进入了开始阶段。在该阶段,页面将确定请求是发回请求还是新的客户端请求,并设置IsPostBack属性。 q 初始化:在页面开始后,进入了初始化阶段。初始化期间,页面可以使用服务器控件,并为每个服务器控件进行初始化。 q 加载:页面加载控件。 q 验证:调用所有的验证程序控件的Vailidate方法,来设置各个验证程序控件和页的属性。 q 回发事件:如果是回发请求,则调用所有事件处理的程序。 q 呈现:在呈现期间,视图状态被保存并呈现到页。 q 卸载:完全呈现页面后,将页面发送到客户端并准备丢弃时,将调用卸载。 4.6 ASP.NET生命周期的事件 在页面周期的每个阶段,页面将引发可运行用户代码进行处理事件。对于控件产生的事件,通过声明的方式执行代码,并将事件处理程序绑定到事件。不仅如此,事件还支持自动事件连接,最常用的就是Page_Load事件了,除了Page_Load事件以外,还有Page_Init等其他事件,本节将会介绍此类事件。 4.6.1 页面加载事件(Page_PreInit) 每当页面被发送到服务器时,页面就会重新被加载,启动Page_PreInit事件,执行Page_PreInit事件代码块。当需要对页面的控件进行初始化时,则需要使用此类事件,示例代码如下所示。 protected void Page_PreInit(object sender, EventArgs e) //Page_PreInit事件 { Label1.Text = “OK”; //标签赋值 } 在上述代码,当触发了Page_PreInit事件时,就会执行该事件的代码,上述代码将Lable1的初始文本值设置为“OK”。Page_PreInit事件能够让用户在页面处理,能够让服务器加载时只执行一次而当网页被返回给客户端时不被执行。在Page_PreInit可以使用IsPostBack来实现,当网页第一次加载时IsPostBack属性为false,当页面再次被加载时,IsPostBack属性将会被设置为true。IsPostBack属性的使用能够影响到应用程序的性能。 4.6.2 页面加载事件(Page_Init) Page_Init事件与Page_PreInit事件基本相同,区别在于Page_Init并不能保证完全加载各个控件。虽然在Page_Init事件,依旧可以访问页面的各个空间,但是当页面回送时,Page_Init依然执行所有的代码并且不能通过IsPostBack来执行某些代码,示例代码如下所示。 protected void Page_Init(object sender, EventArgs e) //Page_Init事件 { if (!IsPostBack) //判断是否第一次加载 { Label1.Text = “OK”; //将成功信息赋值给标签 } else { Label1.Text = “IsPostBack”; //将回传的值赋值给标签 } } 4.6.3 页面载入事件(Page_Load) 大多数初学者会认为Page_Load事件是当页面第一次访问触发的事件,其实不然,在ASP.NET页生命周期内,Page_Load远远不是第一次触发的事件,通常情况下,ASP.NET事件顺序如下所示。 q 1. Page_Init()。 q 2. Load ViewState。 q 3. Load Postback data。 q 4. Page_Load()。 q 5. Handle control events。 q 6. Page_PreRender()。 q 7. Page_Render()。 q 8. Unload event。 q 9. Dispose method called。 Page_Load事件是在网页加载的时候一定会被执行的事件。在Page_Load事件,一般都需要使用IsPostBack来判断用户是否进行了操作,因为IsPostBack指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问,示例代码如下所示。 protected void Page_Load(object sender, EventArgs e) //Page_Load事件 { if (!IsPostBack) { Label1.Text = “OK”; //第一次执行的代码块 } else { Label1.Text = “IsPostBack”; //如果用户提交表单等 } } 上述代码使用了Page_Load事件,在页面被创建时,系统会自动在代码隐藏页模型的页面增加此方法。当用户执行了操作,页面响应了客户端回发,则IsPostBack为true,于是执行else的操作。 4.6.4 页面卸载事件(Page_Unload) 在页面被执行完毕后,可以通过Page_Unload事件用来执行页面卸载时的清除工作,当页面被卸载时,执行此事件。以下情况会触发Page_Unload事件。 q 页面被关闭。 q 数据库连接被关闭。 q 对象被关闭。 q 完成日志记录或者其他的程序请求。 4.6.5 页面指令 页面指令用来通知编译器在编译页面时做出的特殊处理。当编译器处理ASP.NET应用程序时,可以通过这些特殊指令要求编译器做特殊处理,例如缓存、使用命名空间等。当需要执行页面指令时,通常的做法是将页面指令包括在文件的头部,示例代码如下所示。 <%@ Page Language=“C#” AutoEventWireup=“true” CodeBehind=“Default.aspx.cs” Inherits=“MyWeb._Default” %> 上述代码,就使用了@Page页面指令来定义ASP.NET页面分析器和编译器使用的特定页的属性。当代码隐藏页模型的页面被创建时,系统会自动增加@Page页面指令。 ASP.NET页面支持多个页面指令,常用的页面指令如下所示。 q @ Page:定义ASP.NET页分析器和编译器使用的页特定(.aspx文件)属性,可以编写为<%@ Page attribute=“value” [attribute=“value”…]%>。 q @ Control:定义ASP.NET页分析器和编译器使用的用户控件(.ascx文件)特定的属性。该指令只能为用户控件配置。可以编写为<%@ Control attribute=“value” [attribute=“value”…]%>。 q @ Import:将命名空间显示导入到页,使所导入的命名空间的所有类和接口可用户该页。导入的命名空间可以是.NET Framework类库或用户定义的命名空间的一部分。可以编写为<%@ Import namespace=“value” %>。 q @ Implements:提示当前页或用户控件实现制定的.NET Framework接口。可以编写为<%@ Implements interface=“ValidInterfaceName” %>。 q @ Reference:以声明的方式指示,应该根据在其声明此指令的页对另一个用户控件或页源文件进行动态编译和链接。可以编写为<%@ Reference page | control=“pathtofile” %>。 q @ Output Cache:以声明的方式空间ASP.NET页或页包含的用户控件的输出缓存策略。可以编写为<%@ Output Cache Duration=“#ofseconds” Location=“Any | Client | Downstream | Server | None” Shared=“True |False” VaryByControl=“controlname” VaryByCustom=“browser | customstring” VaryByHeader=“headers” VaryByParam=“parametername” %> q @ Assembly:在编译过程将程序集链接到当前页,以使程序集的所有类和接口都可用在该页上。可以编写为<%@ Assembly Name=“assemblyname” %>或<%@ Assembly Src=“pathname” %>的方式。 q @ Register:将别名与命名空间以及类名关联起来,以便在自定义服务器控件语法使用简明的表示法。可以编写为<%@ Register tagprefix=“ tagprefix” Namespace=“namepace” Assembly=“assembly” %>或<%@ Register tagprefix=“ tagprefix” Tagname=“tagname” Src=“pathname” %>的方式。 4.7 ASP.NET网站文件类型 在ASP.NET包含诸多的文件类型,这些类型的文件由ASP.NET支持和管理,而除了这些文件以外,其他的文件都由IIS托管。使用VS2008能够创建大部分可以使用ASP.NET托管运行的程序。同时,使用应用程序映射可以将文件类型映射到应用程序。当需要伪静态时,很可能需要将.html后缀托管到IIS的应用扩展,因为默认情况下ASP.NET不会处理HTML的操作。 技巧:现在的网站构架,生成静态是一种降低网站压力的一种很好的解决方案。在某些情况下,服务器可能需要伪静态支持,就是将.aspx页面后缀显式成.html后缀,让搜索引擎能够更好的搜录。 1.ASP.NET管理的文件类型 ASP.NET管理的文件类型能够在ASP.NET应用程序被ASP.NET应用程序的不同模块进行访问和调用,这些文件可能是用户能够直接访问的,也有可能是用户无法直接访问的。ASP.NET管理的文件类型如表4-1所示。 表4-1 ASP.NET管理的文件类型 文件类型 保存位置 描述 .asax 根目录。 Global.asax 文件。包含 HttpApplication 对象的派生代码,用于重新展示 Application 对象。 .ascx 根目录或子目录。 可重用的自定义 Web 控件。 .ashx 根目录或子目录。 处理器文件。包含实现 IHttpHandler 接口的代码,用于处理输入请求。 .asmx 根目录或子目录。 XML Web Services 文件。包含由 SOAP 提供给其他 Web 应用的类对象和功能。 .aspx 根目录或子目录。 ASP.NET Web 窗体。包含 Web 控件和其他业务逻辑。 .axd 根目录。 跟踪视图文件。通常是 Trace.axd。 .browser App_Browsers 目录。 浏览器定义文件。用于识别客户端浏览器的可用特征。 .cd 根目录或子目录。 类图文件。 .compile Bin 目录。 定位于适当汇编集的预编译文件。可执行文件(.aspx,.ascx,.master,theme)预编译后放在 Bin 目录。 .config 根目录或子目录。 Web.config 配置文件。包含用于配置 ASP.NET 若干特征的 XML 元素集。 .cs,.jsl,vb App_Code 目录。有些是 ASP.NET 的代码分离文件,位于与 Web 页面相同的目录。 运行时被编译的类对象源代码。类对象可以是 HTTP 模块,HTTP 处理器,或 ASP.NET 页面的代码分离文件。 .csproj,vbproj,vjsproj Visual Studio 工程目录。 Visual Studio 客户工程文件。 .disco,.vsdisco App_WebReferences 目录。 XML Web Services Discovery 文件。用于定位可用 Web Services。 .dsdgm,dsprototype 根目录或子目录。 分布式服务图表(DSD)文件。可添加到 Visual Studio 方案,为反向引擎提供消耗 Web Services 时的交互性图表。 .dll Bin 目录。 已编译类库文件。作为替代,可将类对象源代码保存到 App_Code 目录。 .licx,.webinfo 根目录或子目录。 许可协议文件。许可协议有助于保护控件开发者的知识产权,并对控件用户的使用权进行验证。 .master 根目录或子目录。 模板文件定义 Web 页面的统一布局,并在其他页面得到引用。 .mdb,.ldb App_Data 目录。 Access 数据库文件。 .mdf App_Data 目录。 SQLServer 数据库文件。 .msgx,.svc 根目录或子目录。 Indigo Messaging Framework(MFx)服务文件。 .rem 根目录或子目录。 远程处理器文件。 .resources App_GlobalResources 或 App_LocalResources 目录。 资源文件。包含图像,本地化文本,或其他数据的资源引用串。 .resx App_GlobalResources 或 App_LocalResources 目录。 资源文件。包含图像,本地化文本,或其他数据的资源引用串。 .sdm,.sdmDocument 根目录或子目录。 系统定义模型(SDM)文件。 .sitemap 根目录。 网站地图文件。包含网站的结构。ASP.NET 通过默认的网站地图提供者,简化导航控件对网站地图文件的使用。 .skin App_Themes 目录。 皮肤定义文件。用于确定显示格式。 .sln Visual Web Developer 工程目录。 Visual Web Developer 工程的项目文件。 .soap 根目录或子目录。 SOAP 扩展文件。 注意:ASP.NET 管理的文件类型映射到 IIS 的 Aspnet_isapi.dll。 2.IIS 管理的文件类型 在ASP.NET应用程序,有些动态的文件如asp文件就不被ASP.NET应用程序框架管理,这些文件由IIS进行管理,由IIS管理的文件类型如表4-2所示。 表4-2 IIS管理的文件类型 文件类型 保存位置 描述 .asa 根目录。 Global.asa 文件。包含 ASP 会话对象或应用程序对象生命周期的各种事件处理。 .asp 根目录或子目录. ASP Web 页面。包含 @ 指令和使用 ASP 内建对象的脚本代码。 .cdx App_Data 目录. Visual FoxPro 的混合索引文件。 .cer 根目录或子目录。 证明文件。用于对网站的授权。 .idc 根目录或子目录。 Internet Database Connector(IDC)文件。被映射到 httpodbc.dll。 注意:由于无法为数据库连接提供足够的安全性,IDC 将不再被继续使用。IIS 6.0 是最后一个支持 IDC 的版本。 .shtm,.shtml,.stm 根目录或子目录。 包含文件。被映射到 ssinc.dll。 注意:IIS管理的文件类型被映射到IIS的asp.dll 3.静态文件类型 IIS仅提供已注册MIME类型的静态文件服务,注册信息保存在Mime Map IIS元数据库。如果某种文件类型已经映射到指定应用程序,在不需要作为静态文件的情况之下,无需再在MIME类型列表进行包含。默认的静态文件类型如表4-3所示。 表4-3 静态文件类型 文件类型 保存位置 描述 .css 根目录或子目录,以及 App_Themes 目录。 样式表文件。用于确定 HTML 元素的显示格式。 .htm,.html 根目录或子目录。 静态网页文件。由 HTML 代码编写。 注意:虽然ASP.NET的代码页面也能够手动添加到MIME类型列表,但是这样操作浏览者就能够看到页面源代码,从而暴露ASP.NET页面源代码,相对于服务器而言是非常不安全的。 4.8 小结 本章介绍了ASP.NET页面生命周期,以及ASP.NET页面的几种模型。ASP.NET页面生命周期是ASP.NET非常重要的概念,熟练掌握ASP.NET生命周期能对ASP.NET开发,自定义控件开发起到促进作用。本章还介绍了: q 代码隐藏页模型的解释过程。 q 代码隐藏页模型的事件驱动处理。 q ASP.NET网页的客户端状态。 q ASP.NET页面生命周期。 q ASP.NET生命周期的事件。 q ASP.NET 网站文件类型。 上面的章节都分开的讲解了ASP.NET运行的一些基本机制,在了解了这些基本运行机制后,就能够在.NET框架下做ASP.NET开发了。虽然这些都是基本概念,但是在今后的开发,会起到非常重要的作用。
.Net精品就业班课程表 : 1、.Net基础加强(10天) 核心技术课程 常用数据结构(List、Dictionary、Array)、多态、常用设计模式、反射、常用.net类库、泛型、IO流、委托事件、正则表达式、XML、反射、GC等。 2、数据库开发及ADO.Net(6天) 核心技术课程 数据库开发基础、Microsoft SQLServer基础、SQL语言基础、索引、事务、SQL语言高级技术(空值处理、聚合与分组、数据分页、Union、日期函数、类型转换函数、流控函数、表连接、子查询、存储过程、触发器)、数据库设计范式、数据库调优。 ADO.Net(行集、数据集、类型化数据集、SQLHelper、SQL注入漏洞防范、数据绑定)。 3、三层架构MIS项目(5天) 查看项目演示 功能点 本项目基于流行的三层架构(DAL+BLL+UI)。 主要功能点:高安全性的用户管理体系、高安全性的异构系统数据导入导出、拼音检索、复合检索、无限级次数据管理、个性化邮件群发、Excel文件导入导出。 技术点 ADO.Net技术应用、SQLServer、MD5安全算法、基于NPOI的Excel文件处理、树状结构数据处理、递归、CodeSmith、代码生成器、三层架构。 项目说明 这是一个用WinForm技术实现的系统,传智播客在开课的半个月就安排一个项目,体现了传智播客“项目驱动学习”的先进教学理念。 4、网页开发与JavaScript(7天) 查看案例演示 核心技术课程 HTML基础加强、css(包含Div+CSS布局)、JavaScript、Dom(事件、window对象、document对象、对话框、定时器、粘贴板、动态Dom、跨浏览器兼容性解决方案、JS压缩和CDN、Internet Explorer Developer Toolbar)、JQuery(JQuery函数、隐式迭代、链式编程、id选择器、tag选择器、CSS选择器、层次选择器、表单选择器、过滤选择器、复合选择器、节点导航、节点操作、样式操作、事件、动画、JQuery Cookie、JQuery Live、JQueryUI)。 课程说明 CSS、JavaScript是ASP.Net开发的基础,把这些掌握好了就能很轻松的学会ASP.Net;Dom是实现网页动态效果的技术,在网站越来越个性化年代,招聘企业对应聘者的Dom水平要求非常高;JQuery是近几年异军突起的JavaScript框架库,几乎成了Web前端开发事实上的标准,大部分企业都是使用JQuery进行Web前端的开发。 学完了这阶段课程,学员将学会开发主流网站的前端效果,比如:焦点图、滚动展示图、网页防复制、网页自定义菜单、WebOS、美女时钟、无刷新评论、评分控件、表格特效、图片悬浮详细信息、微博界面、QQ消息框效果、Div对话框等。 5、ASP.Net开发(12天) 核心技术课程 自己动手写Web服务器(Socket、多线程)、ashx模式Web开发、ViewState、Cookie、Session、Http协议、Web开发基本原则、XSS漏洞防范、Request对象、Response对象、Server对象、虚拟路径、HttpHandler深入、ASP.Net生命周期、WebForm原理、服务端基本控件、WebShell漏洞防范、HTML服务端控件、验证框架、MasterPage、数据绑定控件(ObjectDataSource、列表类绑定控件、GridView、FormView、ListView、Repeater、高效率分页)、CKEditor、Membership、缓存、互联网调优(SEO、HTML压缩、页面静态化、移除ViewState、表单GET化)、URL重写、错误处理、AJAX(XMLHTTP、JQuery AJAX、Json)、全局文件、HttpHandler与HttpModule、IIS配置。 课程说明 由于微软对ASP.Net进行高度封装,因此ASP.Net入门非常简单,开发人员不需要了解HTML、JavaScript、Http协议也可以快速开发出一个Web系统,正因为如此,社会上充斥着大量这样的“拖控件的开发人员”,使得很多Java、PHP等语言的开发人员诋毁ASP.Net开发人员的时候经常会说“你们什么都不懂,就会拖控件”。ASP.Net的快速开发是ASP.Net非常大的一个优点,可以加快开发效率,这是行业的发展趋势,但是局限于这样的“傻瓜化开发方式”的开发人员的竞争力和成长性都是非常有限的,遇到ASP.Net一些高级技术(比如ASP.Net MVC、SEO、网站调优、服务端客户端混合编程、AJAX等)的时候就完全不能胜任。通过上一个阶段的HTML、JavaScript、Dom的学习,学员已经有了很好的HTML、JavaScript基础;在ASP.Net课程的一开始,不是直接教学员怎么拖ASP.Net控件进行快速开发,而是通过ashx的模式开发原始的动态网站,让学员明白“请求—处理—响应模型”、“Http协议、Http无状态”、“c#代码渲染生成浏览器端JavaScript”、“ViewState的作用”、“Session的原理”等这些基本而又重要的原理,从而扫清后面ASP.Net知识学习的基础性障碍。 由于访问量非常大,因此互联网项目的开发对ASP.Net开发人员的要求非常高,所以我们安排了互联网调优、缓存、网站防黑等内容。 ASP.Net控件数量是非常多的,讲解ASP.Net的教材通常要上千页,让初学者望而生畏,其实ASP.Net大部分控件相似性非常强的,同类型的控件学会了一个那么其他控件也就很容易学会了。比如只要学会了DropDownList,那么RadioButtonList、ListBox、CheckBoxList、BulletedList等几乎不用学就会用;再比如只要学会了ListView,那么Repeater、GridView、FormView等控件也是触类旁通。传智播客认真钻研教学,对知识进行分类、整理、提炼精华,让学员在短时间内掌握ASP.Net技术。 ASP.Net有一些技术是有局限性的,传智播客根据这些技术在企业的实际应用情况进行了调整、补充。比如项目几乎没有在UI层直接访问数据库的,而是采用三层架构,因此我们不讲解UI层直连数据库的控件SQLDataSource,而是把主要精力放在讲解三层架构开发模式。再比如ASP.Net内置的AJAX解决方案UpdatePanel只在部分要求不高的内网项目才被使用,因此我们在讲解UpdatePanel的使用和原理之外,把更多的时间放在讲解企业用的最多的JQuery AJAX解决方案上。 6、B/S系统项目(7天) 项目说明 1、网上图书商城。这是一个典型的B2C网上商城,使用经典的复杂三层架构(工厂模式)进行开发。涉及图书管理、搜索、订单管理、导航管理等核心模块。在讲解ASP.Net基础后安排这样一个B2C网上商城系统,让学员在实际项目将学到的知识学以致用。 2、办公自动化OA系统。这是一个典型的基于ASP.Net技术的OA协同办公项目,包含了权限管理、公告管理、文档管理、工作流、论坛管理、新闻模块管理、人员管理等典型的OA系统模块。 3、数据采集和邮件群发。这是一个基于多线程的邮件营销平台,核心技术包括网络爬虫、多线程、HTML解析、邮件发送、生产者消费者模式等。 注:以上三个案例,上课时会根据每个班的课堂反馈选择其一个案例予以讲解学习。 7、如鹏网项目(9天) 查看项目演示 功能点 站内搜索、栏目管理、视频播放(完全模仿优酷视频页面)、焦点图、静态页面生成(新浪、搜狐等大型网站普遍采用的技术)、文章管理、无刷新评论、评论的无刷新分页、敏感词过滤、用户管理、友情链接管理、缓存管理、广告位管理、RSS输出、水印设置、无刷新上传图片、搜索引擎优化设置、数据备份恢复、伪静态设置、网上商城、订单管理、在线支付(支持支付宝、财付通、块钱等第三方支付平台)、网站调优(数据库优化、缓存、静态页、CSS Spirit、js压缩)。 技术点 搜索引擎技术:Lucene.Net、多线程开发、爬虫技术、网页分析、正则表达式、Log4Net日志框架、Quartz.Net定时作业调度。 大型互联网开发技术:代码生成、网页静态化、基于JQuery的Web2.0页面开发、AJAX、SEO、网站调优、采集器、RSS/XML、网站防黑(防XSS攻击、防注入漏洞攻击、防CC攻击、防挂马、防盗链、敏感词过滤、广告帖智能过滤)、IIS管理与调优、流量分析、第三方脚本嵌入(广告、统计代码、内容联盟等)、图片服务器分离。 项目说明 如鹏网项目是已经上线三年的网站,日访问量最高20000人次,网址www.rupeng.com。本系统旧版本基于PHP、J2EE技术,由如鹏网开发者亲手操刀用.net重写新版本。系统分为前台Web界面、后台管理界面、站内搜索、监控客户端四个子系统。 大型互联网站由于访问量非常大,因此不是那些单纯用ASP.Net控件拖拽开发的开发人员能够开发的,也不是闭门造车能够造出来的,必须是在实际项目经过无数访问者的使用、反馈、修改才能做出来的。搜房网、汽车之家等大型网站用到的网站静态化、图片服务器分离、高性能缓存、HTML/JS压缩、CDN、CSS Sprite、负载均衡、Memcached、镜像服务器同步等问题不是那些随手写出来的所谓在线商城、电子商务系统所所能够涉及到的。 这个项目完全按照高访问量互联网站进行设计,通过这个项目,学员不仅可以在实战巩固对前面学习的ASP.Net、ADO.Net、WinForm等知识的掌握,还可以掌握网站防黑、缓存、SEO、静态化、搜索引擎技术、AJAX等大型互联网开发涉及到的技术。 8、.Net新技术(Windows Phone、ASP.Net MVC)(6天) 项目说明 未来是移动互联网的时代,未来将是Windows Phone、Android、iphone三足鼎立的时代,掌握了移动开发的技能的人是就业市场的抢手货。微软推出的Windows Phone平台是微软在移动互联网时代的一个重量级产品,微软对于WindowsPhone7的推广力度非常大,因此很多公司也开始进行Windows Phone7产品的研发,2011年下半年Windows Phone7开发人员的需求将会出现井喷,为了帮助学员掌握移动3G开发技术,传智播客.Net班加入了Windows Phone开发课程,采用传智播客独创的WP7Simulator教学平台,学员可以做出一个基于云计算架构的LBS系统。点击查看传智播客独创WP7Simulator教学平台。 ASP.Net MVC是微软推出的区别于ASP.Net WebForm的Web开发新技术,由于ASP.Net MVC解决了ASP.Net WebForm的很多缺点,非常适合大型、型项目的开发,一经推出就受到了.Net开发社区的追捧,很多.Net开发人员的职位要求都提到了MVC,可见掌握ASP.Net MVC技术必将提升自己就业的砝码。 9、就业指导(2天) 项目说明 总结以往所学知识,讲解《传智播客.Net面试、笔试宝典》,介绍简历、笔试、面试等所需的知识和技巧。

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧