ASP.NET学习总结
前面一篇讲到:ASP.NET初学者应该从哪里开始入手(新人学习计划)
这里再列出一篇asp.net学习总结。
第一章:
1.代码后置(CodeBehind)好处:代码和页面内容分离,使代码更清晰
2.控件的可拖移:选中控件-->菜单-->布局-->位置-->绝对定位
3.打开"服务器资源管理器":视图-->服务资源管理器 (可以连接数据库)
4.有分页功能的数据展示控件:GridView、DetailView 作添加功能时,如果直接连数据库,拉入DetailView 要更改属性DefaultMode为Insert
5.放在App_Code中的文件是全局文件
6.控件的AutoPostBack属性在使用DropDownList控件如果需要数据随下拉框的值更改时改变时,需要将此属性设置成true
第二章:
一、数据传递
(1): get获取:Request.QueryString["paraName"]
(2): post获取:Request.Form["paraName"]
1、在一般情况下本页面post到本页面[回传]
判断是首次加载还是回传-----IsPostBack if(!IsPostBack)...页面第一次加载时,执行if里面的代码
2、跨页跳转
2.1: Button -- PostBackUrl[Click事件不会执行] 跨服务器,相似于Click事件中Response.Redirect(url)
2.2: Server.Excute 不转移控制权, 本页面显示 Url重定向(不跳转到别的页面)
2.3: Server.Transfer 转移了控制权, 本页面不显示(Server.Transfer)
备注: .NET已经对get,post进行了封装
二、状态保持
(1): Session:
Session["UserData"] --> Session["UserData_SessionID"]
Clear() --> 清空Session,不改变SessionID
Abandon() --> 清空Session,改变SessionID,结束当前会话,所有信息消失
(2): Application
定义在全局应用程序类[Global.asax]中的Application_Start
(3): Cookie:只能保存文本,可以序列化成xml保存
Response.Cookies[Cookie名称].Value=变量值; //在客户端写入Cookie string 变量名=Request.Cookies[Cookie 名称].Value; //读取客户端Cookie HttpCookie hcCookie=new HttpCookie(Cookie名称,值); //新添加一个Cookie hcCookie.Expires=DateTime.Now.AddYears(1); //新建Cookie 在本机上的保存时间为1年 Response.Cookie.Add(hcCookie);
(4): ViewState
页面级别的状态保存--object
序列化---远程传输
缺点:性能低,不安全,一般不用
(5): 用隐藏控件
HiddenField---string
(6): 数据库
(7): 文件
(8): 缓存
三、Server
A: MapPath -- 得到的是物理路径
应用: 保存文件时一定需要一个完整的物理路径
例如: 网站根目录: D://MySchool
代码: Server.MapPath("~/upFile/ziliao.txt") //返回路径:D://MySchool/upFile/ziliao.txt
四、页面执行顺序
(1):Page_Load
(2):验证事件
(3):服务器控件事件 如:Button_ click
(4):Render html生成事件
//在所有事件执行完毕后再执行该事件
protected override void OnPreRender(EventArgs e) {}
五、获取客户端信息
获得客户IP地址: Request.UserHostAddress;
获取当前浏览器版本信息:Request.ServerVariables["HTP_USER_AGENT"]
获取当前客户浏览器使用语言:Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"]
……
六、页面之间的数据传递:
protected void Page_Load(object sender, EventArgs e) { if(Page.PreviousPage != null)//当判断时,又会跳转的源页面,执行源页面的代码 if(PreviousPage.IsCrossPagePostBack) this.lblShowURL.Text="您的查询条件为:"+((TextBox)this.PreviousPage.FindControl("txtKeyWord").Text; } //一般不用上面这种方法,而用下面的 if(Request.Form["txtKeyWord"] != null) this.lblShowURL.Text="您的查询条件为:"+Request.Form["txtKeyWord"];
第三章:
1.服务器控件 AutoPostBack 自动回发
如果一个对象有 runat="server" 则其是服务器控件
服务器控件必须放在服务器form中,一个页面只能有这一个表单
2.在后置代码中隐藏HTML服务器控件:this.divHead.Style.Add("display","one");
3.让按钮不作验证:设置按钮的CausesValidation为false
4.ValidationGroup 可使不同的控件在不同的组中,各自不受其它控件事件的影响
5.动态改变母版页
前提条件:所有ContentPlaceHolderID一致
this.MasterPageFile="~/母版.master";
6.隐藏母版页中ID=loginOrRegister的控件
this.Master.FindControl("loginOrRegister").Visible = false;
内容页给母版页的文本框赋值:
if(this.Master != null) TextBox txt=this.Master.FindControl("TextBox1") as TextBox; if(txt != null) txt.Text=this.TextBox1.Text;
7.ServerCtrl.ClientID
document.getElementById("<%=this.TextBox1.ClientID%>").Value;//给子页面名称为TextBox1的文本框赋值
第四章:
一、 三层,工厂模式[反射]
抽象工厂
反射[spring]: 工厂,策略,provider
抽象工厂和反射细节区别
A: DALFactory
B: 配置文件
appSettings-->name=dalType
value=RoleRightSys.SqlServerDAL
(1):value必须是程序集名称[不包括扩展名]
(2):程序集项目中的程序集名称和默认命名空间要相等
(3):将生成的程序集反射成对象
public static T CreateOjectDal<T>(string className) { string path = DBType; className = path + "." + className; return (T)Assembly.Load(path).CreateInstance(className); //找程序集-->实例化类--> 转为父类 }
例如:DBType=RoleRightSys.SqlServerDAL
className=RoleInfoDal
T=IRoleInfo
最终:className=RoleRightSys.SqlServerDAL.RoleInfoDal
1):Assembly.Load(path) 加载path指定的程序集
错误: 程序集找不到 ----->工厂项目和path指定的项目不再同一目录
程序集名称错误 ----->查看项目的属性-->程序集名称
2):CreateInstance(className)---实例化对象
错误: 命名空间或类名不匹配, 区分大小写
3):确保实例化对象继承了T所指定的接口
程序集:.exe[控制台应用程序,window应用程序]或.dll[类库]
用反射实现的优点:
A: 代码简捷 一个类 一个方法
B: 扩展性更好[功能扩展:多一个接口, 支持扩展:多一个数据库]
二、 xml操作[基础]
A: xml的序列化
1):更加简单地替换IO操作
2):结合WebService工作
3):配合Ajax工作
要求
1):被序列化的类必须用public修饰
2):被序列化的类必须有默认的构造函数
3):被序列化的相关类也必须满足1),2)条件
使用场合
1):单纯为了数据持久化
2):为了实现依赖缓存
缺点:不能按需求完成层次结构
三、页面中输出客户端脚本(JavaScript)
this.Page.ClientScript.RegisterStartupScript(this.GetType(),"","<script>alert('请填写用户名!')</script>");
第五章:
1.调用脚本:
this.ltMain.Text="<script>alert('注册成!');window.location='default.aspx'</script>";
2: 光棒效果: 订阅RowDataBound事件,行数据绑定后触发
protected void gvBooks_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes.Add("onmouseover", "currentcolor=this.style.backgroundColor;this.style.backgroundColor='#6699ff'"); e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor"); } }
3: 全选
3.1: 添加自定列 TemplateField
3.2: 编辑自定义列
3.2.1: HeaderTemplate html-->checkbox
3.2.2: ItemTemplate 服务器checkbox
3.3 html-->checkbox 的 onclick 事件
4: 类型修改
protected void btnModify_Click(object sender, EventArgs e) { StringBuilder ids = new StringBuilder(); foreach (GridViewRow row in this.gvBooks.Rows)//遍历整个GridView行 { CheckBox ck = row.FindControl("ckItem") as CheckBox; if (ck != null && ck.Checked) { ids.Append(gvBooks.DataKeys[row.RowIndex].Value.ToString() + ",");//必须设置 GridView的属性 --> DataKeyNames为Id (bookid) } } if (ids.Length != 0) { string strIds = ids.ToString(); strIds = strIds.Substring(0, strIds.Length - 1); BookManager.ModifyCatagory(strIds, ddlTypeName.SelectedValue.ToString()); this.gvBooks.DataBind(); } }
更新sql为update book set CategoryID=1 where bookid in (1,2,3,4,5)
5: 如果要Html标签正确显示效果:设置: 数据项的 HtmlEncode =false
6.Eval 和Bind方法的区别:
Eval 为只读的方法,而Bind方法会将值回传到服务器
Eval重载方法:<%# Eval("PublishDate","{0:dd/MM/yyyy}")%> //0代表对应的PublishDate字段,dd/MM/yyyy为文本的显示格式
Bind既能从服务器获取值又能回传值到服务器
第六章:
1.数据验证控件:
(1).RequiredFieldValidator:非空验证 display属性设置为Dynamic可动态该变(如果一个文本框有两个验证,如果一个验证没有显示,则会隐藏,不会占用存在的空间)
(2)CompareValidator:是否符合要求(比较值) (如果用户输入为空,则不进行验证)
ControlToValidate 要验证的控件
ControlToCompare 要来与要验证控件进行比较的控件的ID
Operator 设置要比较的运算符
例:要比较输入是否为日期类型,需移除ValueToCompare和ControlToCompare的值,设置Type类型为Date,设置Operator值为DataTypeCheck
(3)RangeValidator:范围检查
ControlToValidate 要验证的控件
MaximumValue 最大值(包括最大值)
MinimumValue 最小值(包括最小值)
Type 验证类型
(4)RegularExpressionValidator:正则表达式验证
中文字符的正则表达式:[\u4e00-\u9fa5]
货币(正数或负数):(-)?\d+(\.\d\d)?
(5)CustomValidator:自定义验证控件
ControlTovalidate 要验证的控件的ID
ClientValidationFunction 用于设置客户端验证的脚本函数
(6)ValidationSummary:汇总所有的错误报告
ShowMessageBox 是否显示弹出的提示消息
ShowSummary 是否显示该报告内容(一般为false)
2.Page.IsValid:所有验证是否都通过
3.<asp:Literal id="ltMain" runat ="server"></asp:Literal>:简化Label控件,用它生成的HTML代码不包含任何自动生成的HTML元素
一般在弹出脚本信息的时候用到
如:this.ltMain.Text="<script>alert('注册成功!')</script>";
4.图片上传:
protected void dvBookList_ItemUpdated(object sender,DetailsViewupdatedArgs e) { FileUpLoad fulBook=this.dbBookList.FindControl("fulBook") as FileUpload; Image imgBook=this.dvBookLIst.FindControl("imgBook") as Image; string fileName=fulBook.FileName; if(fileName.Trim().Length !=0) { string strPath=Server.MapPath(imgBook.ImageUrl); fulBook.PostedFile.SaveAs(strPath);//覆盖原来路径中图片 } }
5 .MultiView:可以作下一步的功能
例: mvOne.ActiveViewIndex=0;
mvOne.ActiveViewIndex++;
mvOne.ActiveViewIndex - -;
6.ImageMap:可在一张图片上制造多个连接
例:
<div> <asp:ImageMap ID="imgmap" runat="server" HotSpotMode="Navigate" ImageUrl="~/Images/模型.JPG" OnClick="imgmap_Click"> <asp:RectangleHotSpot Bottom=267 Right=150 AlternateText="User" NavigateUrl="~/FileUpload.aspx" Target="_blank" HotSpotMode="PostBack" PostBackValue="User" /> <asp:RectangleHotSpot Bottom=267 Left=151 Right=318 AlternateText="UserState" NavigateUrl="~/Calendar.aspx" HotSpotMode="PostBack" Target="_blank" PostBackValue="UserState" /> </asp:ImageMap> <asp:Label ID="lblShow" runat="server" Width="312px"></asp:Label> </div>
7.HyperLink :相当于HTML中的<a href=""></a>标签
8.删除
(1): GridView 尽量不要用GridView自带的删除按钮,因为不会提示
自带删除
1: 设置数据源的Delete方法
2: 设置GridView的DataKeyNames--Id
3: 不会提示用户删除
(2): 添加自定义模板,用来删除 添加一个LinkButton
(3): 获取删除项ID LinkButton --> CommandArgument
(4): 设置OnClientClick属性
4.1 直接设置
4.2 RowDataBound 中写代码
(5): 设置CommandName-->MyDel[千万别省事,写成Del]
(6): 订阅GridView的RowCommand,也可以订阅LinkButton的Click事件
9.修改
(1): 编写修改的BLL层方法,参数一般不能是实体类,而是参数列表
参数的名字应该和实体类的属性对应,但不区分大小写,可以自由排列
(2): 如果遇到html格式的内容,应设置Page的ValidateRequest="false" (页面最上面写)
(3): 如果不使用自定义模板,那么将不更新字段的ReadOnly设置为true
(4): 如果更新的方法参数没有对应的更新项,那么应在ItemUpdating赋值
(5): 如果使用自定义模板列,注意Bind和Eval区别
(6): 如果要添加验证,必须变成模板列
第七章:
1.GridView展示:多行多列数据
DataList 展示:多行单列数据
Repeater展示:单行多列数据
2.PagedDateSource类的分页
CurrentPageIndex //当前页 PageCount //总页数 Count //总记录数 PageSize //每页记录数 DataSource // 数据源 AllowPaging // 控件是否自动分页 IsFirstPage // 控件是第一页 IsLastPage // 页面是最后一页
缺点:不能超过一万行的数据,占用资源
例:
PagedDataSource savePage = new PagedDataSource(); savePage.DataSource = BookManager.GetOrderedSmallBooksByCategoryId(0, ViewState["Order"].ToString()); savePage.AllowPaging = true;//不写不会分页 savePage.PageSize = 12; savePage.CurrentPageIndex = Pager; this.Repeater.DataSource = savePage; this.Repeater.DataBind();//不写不会显示
3.ViewState["名称"]=值; 页面级别的信息保持,不影响其它页面的分页
第八章
1. 使用FreeTextBox控件:将FreeTextBox.dll拖入工具箱中,就可以使用
注意:使用该控件,需要在Page指令上添加ValidateRequest="false"
2.CodeSmith工具:编写代码是在CodeSmith Studio中,运行在CodeSmith Explorer中
使用条件:表要有主键,但不能有组合键
模板声明:<% CodeTemplate Language="C#" TargetLanguage="C#" Description=""%>
TargetLanguage:生成文件类型,如果要生成.sql文件,则标记为“T-SQL”
定义参数:<% Property Name="Number" Type="Int32" Category="Context" Description=""%>
Name:参数名
Type :参数类型
Category:生成的模板显示的是输入框还是下拉框等。
如果涉及到数据库访问,需要引入相关的组件并声明命名空间,代码如下:
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
CodeSmith编码例子:(创建一个更新的存储过程)
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %> <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="????" %> <%@ Property Name="ModelsNamespace" Default="Models" Type="System.String" Category="Context" Description="????" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="SchemaExplorer" %> Create PROCEDURE [Pro_Update<%=SourceTable.Name%>] <%for(int i=0;i<SourceTable.Columns.Count;i++)%> <%{%> <%=GetType(SourceTable.Columns[i])%><% if(i<SourceTable.Columns.Count-1)%><%{%>,<%}%> <%}%> as Update Books set <% for(int i=0;i<SourceTable.Columns.Count;i++) %><%{%><%=GetColumn(SourceTable.Columns[i])%><% if(GetColumn (SourceTable.Columns[i]) !="" && i<SourceTable.Columns.Count-1)%><%{%>,<%}%><%}%> where Id=@<%=SourceTable.PrimaryKey.MemberColumns[0].ToString().Substring(SourceTable.PrimaryKey.MemberColumns[0].ToString ().LastIndexOf(".")+1)%> <script runat="template"> public string GetType(ColumnSchema column) { string para="@"+column.Name+" "+column.NativeType; switch(column.DataType) { case DbType.String: case DbType.AnsiString: case DbType.AnsiStringFixedLength: case DbType.StringFixedLength: para+="("+column.Size+")"; break; } return para; } public string GetColumn(ColumnSchema column) { string para; if(SourceTable.NonPrimaryKeyColumns.Contains(column)) para=column.Name+"=@"+column.Name; else para=""; return para; } </script>
第九章
1.ASP.NET在处理HTTP请求时的两个核心的机制是HttpModule和HttpHandler
2.用户控件 后缀名:.ascx (Web 用户控件)
注意: (1).用户控件可以包含其它用户控件
(2).用户控件不可以单独访问
(3).用户控件不可以自己访问自己
(4).不能导入Style样式
(5).内容页的Load事件比用户控件的Load事件先执行
3.HttpHandler程序:后缀名:.ashx (一般处理程序)
注意:public void ProcessRequest(HttpContext context){} 是该程序运行的最终方法,程序运行从该方法开始
该程序可直接访问,并且输出context.Response.Write("Hello World");括号中写的内容
context.MapPath(context.Request.Params["ISBN"].ToString()+".jpg");可获取文件的物理路径
4.在Web.config配置文件的<system.web></system.web>节点中写<add verb="*" path="Image/BookCovers/*.jpg" type="CoverHandler/">
当应用程序访问Image/BookCovers/下面的图片格式为.jpg时,将自动访问ConverHandler类
werb:代表(Get,Post,FTP等)列表,*为通配符,此处表示所有的请求
5.HttpHandler程序默认不能访问session对象,必须实现System.Web.SessionState.IRequiresSessionState接口才行,否则报错
示例:
public class ValidHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState { public void ProcessRequest(HttpContext context) { } }
第十章
1.如果网站有上传功能,要过滤掉文件名为*.aspx ,*.ashx, *.asp
2.在Web.config中自定义节点必须现在<configSections>中声明,例如:
<configSections> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" /> </configSections>
3.加密一个特定网站的web.config文件
在SDK 命令提示中aspnet_regiis -pef "connectionStrings" "E:\ASP\资料\用户控件和内容页的相互传值\Web" -prov "DataProtectionConfigurationProvider"
解密:
aspnet_regiis -pdf "connectionStrings" "E:\ASP.NET\资料\用户控件和内容页的相互传值\Web" -prov "DataProtectionConfigurationProvider"
4.自定义错误:
<customErrors defaultRedirect="~/ErrorPage.htm" mode="RemoteOnly"> <error statusCode="404" redirect="FileNotFound.htm"/> </customErrors>
defaultRedirect代表发生错误时,浏览器重定向到的URL
mode指示启用(On).禁用(Off)自定义错误,还是只让其显示给远程计算机(RemoteOnly),一般用RemoteOnly
error子标签用于定义一些特殊的错误,属性:
statusCode:HTTP错误的状态码,比如,403为禁止访问、404为文件未找到、500为内部服务器错误等
redirect:用于指定当该状态的错误发生时,重定向到的页面的URL
5.调试:
<!-- 设置 compilation debug="true" 将调试符号插入 已编译的页面中。但由于这会影响性能,因此只在开发过程中将此值设置为 true。部署时将此值设置为false --> <!-- 通过 <authentication> 节可以配置 ASP.NET 使用的 安全身份验证模式, 以标识传入的用户。 --> <compilation debug="true"> <assemblies> <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation>
6.运行时配置:<httpRuntime enable="true" executionTimeout="15" maxRequestLength="4096"/>
enable:设置为应用程序的状态,如果设置为false,则相当于关闭了该站点
executionTimeOut:程序执行时间的上限,如果执行一个复杂的循环,如果时间超过了设定的时间,程序将自动结束掉
maxRequestLength:设置最大上传内容大小,默认为4096KB(4MB)。
7.在Visual Studio 命令提示中输入aspnet_regsql 可以创建aspnetdb.mdb数据库
注意:aspnetdb.mdb数据库可自行附加到数据库中
8.部署
部署前准备:
(1).在web.config中关闭调试功能
<compilation debug="false"> <assemblies> <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation>
(2).使用Release的方式编译应用程序
9.发布站点方式:
(1).XCopy方式
语法:xcopy 源目录 目标目录 /f /e /k /h
示例:Xcopy D:\MyBookShop\Web D:\Web\Default.aspx
(2).复制站点
操作:在“解决方案管理器”的工具栏上有一个复制站点的选项
缺点:网站可能被别人破解
(3).发布预编译网站(常用方式)
操作:右键单击“解决方案管理器”中的Web项目,“允许更新此预编译站点”勾上,其它两个复选框不勾,如果“使用此命名和单页程序集”勾上,则站点容易被破解
补充:
1.设置DIV的overflow:hidden 可使DIV过多的时候也不会被撑大,其它内容会自动隐藏
2.使用WdatePicker.js 日期控件
<asp:TextBox ID="TextBox10" runat="server" Text='<%# Bind("PublishDate") %>' CssClass="Wdate" onFocus="new WdatePicker(this,'%Y-%M-%D',true,'default')"></asp:TextBox>
3.代码生成sqlite数据库及表
private static string datasouce = ConfigurationManager.AppSettings["ConnectionString"].ToString(); if (!File.Exists("StoreImage.db3")) { SQLiteConnection.CreateFile("StoreImage.db3"); string sql = "Create Table myPictures(imageID int,imageFile image)";//创建表myPictures SQLiteCommand cmd = new SQLiteCommand(sql, new SQLiteConnection(datasouce)); cmd.Connection.Open(); cmd.ExecuteNonQuery(); cmd.Connection.Close(); }
App.config 文件代码
<configuration> <appSettings> <add key="ConnectionString" value="Data Source=|DataDirectory|\StoreImage.db3"/> </appSettings> </configuration>