diff --git "a/15\345\220\264\346\230\216\346\235\260/ASP.NET.md" "b/15\345\220\264\346\230\216\346\235\260/ASP.NET.md"
new file mode 100644
index 0000000000000000000000000000000000000000..be15bf93eda7ceb7fd89e8b96c9057456dcc1f69
--- /dev/null
+++ "b/15\345\220\264\346\230\216\346\235\260/ASP.NET.md"
@@ -0,0 +1,1821 @@
+# 一、Webform初识
+
+## (1)ASP.NET简介
+
+#### 1.c/s b/s
+
+- C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库(“MySQL知识库”)系统,如Oracle、Sybase、InFORMix或SQL Server。客户端需要安装专用的客户端软件。
+- B/S是Browser/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、InFORMix或SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
+
+#### 2.静态网页&服务器端开发技术
+
+静态网页:
+
+- 以.html 或者.htm 结尾的网页
+- 只能单纯的显示文本和图像
+- 无法和用户接互,无法根据用户的请求显示不同的网页内容
+
+服务器端开发技术:
+
+- 不仅可以显示文本和图像
+- 还可以根据用户请求,动态显示不同的网页内容(与后台交互)
+
+#### 3.ASP.NET优点
+
+- 与浏览器无关
+- 将业务逻辑代码与显示逻辑分开
+- 新的集成开发环境
+- 简单性和易学性
+- 用户帐户和角色
+- 多处理器环境的可靠性
+- 高效的可管理性
+- 执行效率的大幅提高
+- 易于配置和部署
+
+#### 4.ASP.NET功能
+
+- 多语言支持
+- 代码编译执行
+- 缓存机制
+- 服务器控件
+- Web服务
+- 状态管理
+- 安全管理
+- 配置和部署
+
+*******
+
+## (2)常见的服务端开发技术
+
+PHP 、 ASP 、 ASP.NET 、 JSP、 ...
+
+了解ASP:
+
+- Active Server Page -- 动态服务器页面,使用vbscript开发后台程序
+
+ASP.NET:
+
+- 基于.NET平台,可以使用C#和VB.NET开发后台应用程序
+- ASP.NET主要用来开发Web应用程序
+- ASP.NET程序运行在IIS中
+
+#### 1.IIS
+
+- 同样是动态网页技术,ASP.NET就像JSP需要Tomcat服务器或者Apache服务器一样,ASP.NET也需要使用Web服务器作为其发布平台,一般使用IIS作为其Web服务器。IIS是Internet信息服务(Internet Information Server)的缩写,是微软的Internet服务器
+- IIS是Windows Servers 操作系统免费捆绑的组件
+- IIS是web应用程序运行的服务器
+
+******
+
+## ==(3)创建第一个Web应用程序==
+
+创建新的ASP.NET Web 应用程序->Web Forms->勾选掉为HTTPS配置->创建Web窗体
+
+**思考:前端是如何与后台进行交互的?**以html举例
+
+```c#
+//UserLogin.html
+//表单的作用:收集用户输入信息,并提交到后台
+
+
+//UserHandler.ashx
+ public class UserHandler : IHttpHandler
+ {
+ public void ProcessRequest(HttpContext context)
+ {
+ context.Response.ContentType = "text/plain";
+ //1.从前台接收数据到后台
+ string uname = context.Request.Params["uname"];
+ string upwd = context.Request.Params["upwd"];
+ //[背景,请求,参数]
+ //2.在数据库中进行验证
+ DATA.LoginCheck lc = new DATA.LoginCheck();
+ if (lc.CheckAccount(uname, upwd))
+ {
+ context.Response.Write("登陆成功");
+ }
+ else
+ {
+ context.Response.Write("用户名或者密码错误");
+ }
+ }
+ public bool IsReusable //是否自动缓存
+ {
+ get
+ {
+ return false;
+ }
+ }
+ }
+//LoginCheck.cs
+ public class LoginCheck
+ {
+ //3.模拟数据库进行用户验证
+ public bool CheckAccount(string uname, string upwd)
+ {
+ if (uname == "123" && upwd == "admin")//判断账号密码是否正确
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+```
+
+*****
+
+## (4).总结
+
+- ASP.NET是创建动态Web页的一种强大的服务器端新技术
+- IIS(Internet Information Services,Internet信息服务)是基于Windows服务器的服务,可帮助在任何Intranet或Internet上发布信息
+- Web窗体是一项ASP.NET功能,可以使用它为Web应用程序创建用户界面
+- Web窗体将Web应用程序分两部分:可视化组件和该页的编程逻辑
+
+******
+
+# 二、页面对象
+
+## (1)ASP.NET的页面结构
+
+#### 1.网页脚本
+
+通常网页脚本可以完成以下任务
+
+- 指定输入文本或单击按钮后页面的行为
+- 根据用户的输入或选择将应用程序从一个页面导航至其他页面
+- 收集或存储来自客户端的信息
+- 执行数据库操作,如查询、显示数据库数据等
+
+按照脚本执行的位置,网页脚本可分为服务器端脚本和客户端脚本
+
+##### a.服务器脚本
+
+服务器端脚本也是页面的一部分,它不发送至浏览器,而是在请求页面之后和在回送至浏览器之前由服务器处理这些脚本。
+
+```html
+
+```
+
+runat=“server” :此属性指定script块中包含的代码在服务器而不是客户端上运行。此属性对于服务器端代码块是必须的
+
+language属性:用于代码声明的语言
+
+##### b.客户端脚本
+
+客户端脚本是页面的一部分,当用户请求页面时,就将这些脚本发送至浏览器。客户端脚本包含要在客户端执行的脚本代码,通常对客户端事件进行响应。**JavaScript**
+
+客户端脚本可以实现:
+
+- 在将某个页面加载至浏览器或用户单击按钮时,改变页面的外观;
+- 验证用户在窗体中输入的数据,将通过验证的数据发送至服务器;
+- 当触发按钮的单击事件时,在浏览器显示相关的信息。
+
+*****
+
+## (2)ASP.NET运行机制
+
+#### 1.ASP.NET Web 运行原理
+
+| **UserLogin.aspx** | **UserLogin.aspx.cs** | **Webform** |
+| ------------------ | --------------------- | -------------------------- |
+| **可视化组件** | 编程逻辑(代码隐藏) | 由.aspx与aspx.cs共同组成了 |
+| -> | -> | Webform网站页面 |
+
+#### 2.网页生成过程
+
+1. 客户端点击提交按钮或者触发控件的事件
+2. 服务器端刷新整个页面
+3. 执行page_load事件
+4. 执行具体控件的事件并给页面控制赋值
+5. 重新生成新页面的HTML
+6. 使用Response对象返回包含新数据的html页面
+7. 浏览器看到刷新后的页面
+
+#### 3.理解回发
+
+理解网页的首次加载和回发加载的时机
+
+| 当首次打开页面 | 激发事件回传数据-> | 服务器 |
+| -------------- | ------------------ | ------ |
+| 执行事件 | 处理事件返回数据<- | |
+
+- 产生的时机:当用户操作让表单产生submit时,回发产生。
+- 原理分析:当前网页被提交给服务处理,处理时会对当前网页再次加载(重新绘制)。
+- Load事件:不管是首次加载还是回发,都会触发Load事件
+
+*****
+
+## (3)Page对象的事件与属性
+
+#### 1.Page指令
+
+@Page指令允许开发人员为页面指定多个配置选项,并且该指令只能在Web窗体页中使用。每个.aspx文件只能包含一条@Page指令。@Page指令可以指定:页面中代码的服务器编程语言;页面是将服务器代码直接包含在其中(即单文件页面),还是将代码包含在单独的类文件中(即代码隐藏页面);调试和跟踪选项,以及页面是否为某母版页的内容页。
+
+| **属** **性** | **说** **明** |
+| ------------------ | ------------------------------------------------------------ |
+| AutoEventWireUp | 设置为True时,指定页面事件自动触发。这个属性的默认设置是True |
+| Buffer | 设置为True时,支持HTTP响应缓存。这个属性的默认设置是True |
+| ClassName | 指定编译页面时绑定到页面上的类名 |
+| CodeFile | 引用与页面相关的后台编码文件 |
+| CodePage | 指定响应的代码页面值 |
+| ContentType | 把响应的HTTP内容类型定义为标准MIME类型 |
+| Debug | 设置为True时,用调试符号编译页面 |
+| EnableSessionState | 设置为True时,支持页面的会话状态,其默认设置是False |
+| EnableTheming | 设置为True时,页面可以使用主题。其默认设置是False |
+| EnableViewState | 确定是否为服务器控件保持页面的ViewState。默认值是True |
+
+| **ErrorPage** | 为所有未处理的页面异常指定用于发送信息的URL |
+| ---------------- | ------------------------------------------------------------ |
+| Language | 定义内置显示和脚本块所使用的语言 |
+| MasterPageFile | 带一个String值,指向页面所使用的master页面的地址。这个属性在内容页面中使用 |
+| ResponseEncoding | 指定页面内容的响应编码 |
+| Theme | 使用主题功能,把指定的主题应用于页面 |
+| Title | 应用页面的标题。这个属性主要用于必须应用页面标题的内容页面,而不是应用master页面中指定内容的页面 |
+| Trace | 设置为True时,激活页面跟踪,其默认值是False |
+| TraceMode | 指定激活跟踪功能时如何显示跟踪消息。这个属性的设置可以是SortByTime或SortByCategory,默认设置是SortByTime |
+| Transaction | 指定页面上是否支持事务处理。这个属性的设置可以是NotSupported、Supported、Required和RequiresNew,默认值是NotSupported |
+
+#### ==2.页面指令==
+
+```html
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Text.aspx.cs" Inherits="_02页面对象.Text" %>
+```
+
+页面对象:
+
+- 每个.aspx文件对应一个Page对象
+- .aspx页面与后台代码类(局部类)合并生成页面类
+- Page对象是页面类的实例
+- 所有的.aspx文件(Web窗体页)都继承自System.Web.UI.Page类
+
+****
+
+#### ==3.Page对象事件==
+
+##### a.事件
+
+事件句柄(event handler)是一种==针对给定事件来执行代码的子例程。==例如,如果要终端用户单击web页面上的一个按钮时执行某个操作,就要在服务器端代码中创建一个按钮单击事件
+
+| AbortTransaction | 事务处理被终止 |
+| ----------------- | ------------------------------------------------------------ |
+| CommitTransaction | 事务处理被接受 |
+| DataBinding | 把页面上的服务器空间和数据源绑定载一起 |
+| Disposed | Page对象从内存中释放掉。这是Page对象生命周期中的最后一个事件 |
+| Error | 发生未处理的异常 |
+| Init | 在Web窗体的视图状态加载服务器控件并对其初始化。这是web生命周期的第一步 |
+| Load | 在Page对象上载入服务器控件。由于此时视图状态信息是可以使用的,因此载这里可以用代码来改变空间的设置或者载页面上显示文本。 |
+| PreRender | 应用程序将要呈现Page对象 |
+| Unload | 页面从内存中卸载 |
+
+##### ==b.Page对象事件-2==
+
+较常用的一个页面事件是Load,它在C#中的用法如下所示:
+
+```c#
+protected void Page_Load(object sender, EventArgs e)//不管是首次加载还是回发都会执行
+{
+ Response.Write("This is the Page_Load event");
+}
+```
+
+##### c.Page对象事件-3
+
+主页面事件的启动顺序
+
+| 1. PreInit | |
+| ------------------- | ------------------------------------------------------------ |
+| 2. Init | 在Web窗体的视图状态加载服务器控件并对其初始化。这是web窗体生命周期的第一步 |
+| 3. InitComplete | 使用该事件来处理要求先完成所有的初始化工作的任务 |
+| 4. PreLoad | |
+| 5. Load | 在Page对象上载入服务器控件。由于此时视图状态信息是可以使用的,因此载这里可以用代码来改变空间的设置或者载页面上显示文本。 |
+| 6. LoadComplete | 对需要加载页上的所有其它控件的任务使用该事件 |
+| 7. PreRender | 应用程序将要呈现Page对象 |
+| 8.PreRenderComplete | |
+| 9. Unload | 页面从内存中卸载 |
+
+#### 4.Page对象属性
+
+| Application | 为当前Web请求获取Application对象。对于每个Web应用程序来说,只须一个该对象的实例。它是由所有访问该Web应用程序的客户端共享的 |
+| --------------- | ------------------------------------------------------------ |
+| EnableViewState | 指定当前页面上的服务器控件是否在页面请求之间保持ViewState。该值影响网页上的所有控件同时取代控件自身的任何个人设置 |
+| ErrorPage | 获取或设置错误页,在发生未处理的页异常的事件时请求浏览器将被重定向到该页 |
+| ID | 用于获取或设置Page类的特定实例的标识符 |
+| IsPostBack | 获取一个值,该值指示页面是否正为响应客户端回发而加载,或者它是否正被首次加载和访问 |
+| IsValid | 获取一个值,该值指示页面验证是否成功 |
+| Request | 用于获取HttpRequest对象,此对象与从客户端发送HTTP请求数据的当前页面关联 |
+| Response | 用于获取HttpResponse对象,此对象与向客户端发送HTTP响应数据的当前页面关联 |
+| server | 对当前Server对象的引用 |
+| Session | 用于获取ASP.NET提供的当前Session对象 |
+
+#### 5.Page.==IsPostBack[回发]属性==
+
+如何判断回发或者首次加载?如果是首次加载返回false,如果是回发则返回true
+
+在Page_Load事件中编写如下代码:
+
+```c#
+protected void Page_Load(object sender, EventArgs e)
+{
+ if(!Page.IsPostBack)//判断是否回发
+ {
+ //首次加载
+ this.IbITime.Text=System.DateTime.Now.ToString();
+ }
+ else//回发
+ {
+
+ }
+
+}
+```
+
+******
+
+## ==(4).页内数据传递==
+
+在ASP.NET中可以利用视图状态实现页内数据的传递
+
+```c#
+//存放信息
+ViewState["nameId"]="0001";
+
+//读取信息
+String NameID = ViewState["nameID"].ToString();
+```
+
+*******
+
+## ==(5)跨页数据传递==
+
+步骤:
+
+1.在Page1中使用IsPostBackUrl指定Page2
+
+```html
+
+
+
+```
+
+2.在Page2中的Page_Load编写代码:
+
+ 1) 首先判断Page2页面是否有上一页,如果是==没有==那么Page.Previous == null
+
+ 2)其次使用Previous.FindControl()查找上一页的指定ID值
+
+```c#
+protected void Page_Load(object sender, EventArgs e)
+{
+ //处理提交的数据
+ if (Page.PreviousPage!=null)//判断是否是第一个页面
+ {
+ //有的话,查找上一页的指定ID值
+ TextBox t1 = (TextBox)PreviousPage.FindControl("textName");
+ //[上一页控件]
+ if (t1!=null)//判断获取的到就赋值
+ {
+ this.lbl2.Text = "Hello" + t1.Text + "
";
+ }
+ }
+}
+```
+
+*****
+
+## ==(6)总结==
+
+- ASP.NET页文件是含有将在Web上执行代码的文件,其扩展名是.aspx或.ascx
+- ASP.NET页面中使用两种类型的脚本
+- 服务器端脚本
+- 客户端脚本
+- 事件处理程序实际上就是一个子程序,执行任何给定事件的相关代码
+- 在页面加载时引发Page_Load事件。
+- Page.IsPostBack属性用于检查页面是否为首次加载
+- 可以使用PreviousPage对象访问前一个页面的控件值
+
+*********
+
+# 三、内置对象上
+
+## ==(1).HTTP协议的无状态==
+
+理解无状态特性:
+
+- 协议对于事务处理没有记忆能力
+- 对同一个url请求没有上下文关系
+- 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况
+- 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
+
+==即在ASP.NET 后台中,不再有所谓的“成员变量”. (每次都会被初始化)==
+
+********
+
+## (2)ViewState[视图状态]对象
+
+==用于页面数据传输==
+
+ASP.NET专门提供了在一个网页多次请求之间保存信息的对象:ViewState(视图状态)对象来模拟“成员变量”的角色。
+
+- ViewState中保存的数据全部被转换成object类型,取出时务必强制转换成特定类型。
+- ViewState只能在同一个页面的连续多次请求之间保存信息,页面跳转后信息就会丢失。
+
+```c#
+//存放信息
+ViewState["nameId"]="0001";//以键值对存在,键可以自定义
+
+//读取信息
+String NameID = ViewState["nameID"].ToString();
+```
+
+#### 1.实现累加
+
+```html
+
+```
+
+```c#
+ protected void Page_Load(object sender, EventArgs e)
+ {
+ //判断是否是第一次加载
+ if (!Page.IsPostBack)
+ {
+ //1.初始化
+ ViewState["cont"] = 0;//以键值对存在,键可以自定义
+ }
+ }
+
+ protected void but_Click(object sender, EventArgs e)
+ {
+ //没有成员变量
+ //HTTP协议:无状态()
+ //int count = 0;
+ int n = (int)ViewState["cont"];
+ n++;
+ //输出到页面上
+ lab.Text = n.ToString();
+ ViewState["cont"] = n;//+完之后把值传回到初始化
+ }
+```
+
+********
+
+## ==(3)请求与响应==
+
+Request与Response对象的本质:
+
+•Request对象其实是HttpRequest对象,在页面类自动创建。
+
+•Request对象封装了用户请求的信息(用户输入的信息或URL参数)。
+
+•Response对象封装了服务器的响应信息。
+
+******
+
+#### ==1.**Request**[请求]对象==
+
+**Request**如何获取传递过来的数据
+
+- ==QueryString==(查询字符串):获取通过URL传递过来的数据
+- Form(表单数据):获取通过表单提交传输的数据
+- ServerVariables属性:获取Web服务器变量的集合
+- ==Params==[参数]:以上三种方式传输的内容都可以使用该属性获取
+
+##### a.利用a标签实现页面跳转
+
+这是web1.aspx,web2.aspx随便给个标记
+
+```html
+
+```
+
+这是web2.aspx.cs的代码页
+
+##### b.演示QueryString属性
+
+```c#
+ protected void Page_Load(object sender, EventArgs e)
+{
+ string a= Request.QueryString["name"];//请求,查询字符串name,发送请求把name传过来 2.
+ string b = Request.QueryString["class"];
+ Response.Write($"名字{a}来自{b}班");//回应写入,就是一个输出 3.
+}
+```
+
+##### c.演示params属性
+
+```c#
+ protected void Page_Load(object sender, EventArgs e)
+ {
+ string a= Request.Params["name"];//请求,参数
+ string b = Request.Params["class"];
+ Response.Write($"名字{a}来自{b}班");
+ }
+```
+
+*************
+
+#### ==2.**Response[回应]**对象==
+
+##### ==a.Write()[写入]方法==
+
+==在页面输出数据,输出的对象可以是字符,字符串,字符数组,对象或文件。==
+
+```c#
+ Response.Write($"欢迎{name}{sex}登录.");
+```
+
+##### ==b.Redirect()[重定向]方法==
+
+==将用户请求页面重新定向或转到另一页面==,完全跳转,网址页面都会更新
+
+重定向分为:
+
+外部定向:
+
+```c#
+Response.Redirect("https://www.baidu.com/");//跑别人的网站去
+```
+
+内部定向:
+
+```c#
+Response.Redirect("Page3.aspx");//自己的项目里
+Response.Redirect($"Page2.aspx?name={name}&sex={sex}");//把参数一起传过去
+```
+
+******
+
+## (5)利用单选框和重定向练习
+
+根据页面的选项不同,跳转至不同的页面。
+
+这是web1.aspx,web2和web3随便搞一个提示
+
+```html
+
+```
+
+web1.aspx.cs
+
+```C#
+ protected void Button1_Click(object sender, EventArgs e)//按钮事件
+ {
+ string a = TextBox1.Text;//拿来装name的输入框
+ string sex = "";//装性别
+ if (rad1.Checked == true)//如果rad1被选中
+ {
+ sex = "先生";//那么就是先生跳转到web2
+ Response.Redirect($"web2.aspx?name={a}&sex={sex}");
+ }
+ else
+ {
+ sex = "女士";//如果为false那么就是女士跳转到web3
+ }
+ Response.Redirect($"web3.aspx?name={a}&sex={sex}");
+
+ }
+```
+
+web2和web3.aspx.cs
+
+```c#
+ protected void Page_Load(object sender, EventArgs e)
+ {
+ string a= Request.Params["name"];//请求参数name和sex
+ string b = Request.Params["sex"];
+ Response.Write($"欢迎{a}{b}登入");//s
+ }
+```
+
+*******
+
+## ==(4)**Server[服务器]**对象==
+
+Server对象提供了对服务器上方法和属性的访问。最常用的方法是创建ActiveX组件的实例,其他方法可用于URL或者HTML编码成字符串,或者将虚拟路径映射到物理路径以及设置脚本的超时时间等。Server对象是HttpServerUtility类的一个实例,该类包含用于处理Web请求的方法。
+
+==Server对象的方法包括了==
+
+- Execute 方法和 Transfer 方法
+- HTML 编码方法
+- MapPath 方法
+- URLEncode 方法
+
+#### ==1.Execute()方法和Transfer()方法==
+
+Execute()方法和Transfer()方法均会停止当前页面的执行,并转去执行用户在方法内指定的URL,同时用户的会话状态和任何当前的事务处理状态都将传递给新页面。
+
+区别:
+
+| Execute | Transfer |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| URL参数指定的页面处理完后,控制权会返回给先前的页面或调用此方法的页面,并且从此方法调用后的语句继续执行 | URL参数指定的页面处理完后,控制权不会返回给先前的页面,也不会返回给调用此方法的页面,并且在新页面完成执行时结束 |
+
+==注意:Server对象的Tranfer方法和Execute方法仅用于Web窗体==将Transfer方法的preserveForm参数为True,可将窗体的
+QueryString.ViewState等信息提供给目标窗体设置
+
+##### a.Execute()[执行]方法
+
+```c#
+ protected void Button1_Click(object sender, EventArgs e)
+ {
+ Server.Execute("web2.aspx");
+ Response.Write("Execute");
+ }
+```
+
+==网址不更新,有执行跳转,跳转完新页面后返回当前页面==
+
+##### b.Transfer()[转移]方法
+
+```c#
+ protected void Button2_Click(object sender, EventArgs e)
+ {
+ Server.Transfer("web3.aspx");
+ Response.Write("Transfer");
+ }
+```
+
+==网址不更新有执行跳转==
+
+********
+
+#### 2.**UrlEncode&UrlDecode**
+
+URLEncode 方法:
+
+- 在 HTML 编码中,将文本编码成相应的 HTML 是为了在浏览器中正确地显示
+- 如果是要求可靠的 HTTP 传输通过 URL 将编码文本从 Web 服务器传送到客户端,该怎么办?
+- 可使用 URLEncode 方法实现此目的。它将文本编码以便于通过 HTTP 进行可靠的传输
+
+*******
+
+#### 3.**MathPath**
+
+MapPath 方法:
+
+- Web 应用程序位于 IIS 根目录下的虚拟目录中
+- 因此,我们请求网页时,引用称为“虚拟路径”的虚拟目录路径。但是经常需要得到 Web 服务器上的 Web 资源的实际物理路径
+- 用 MapPath 方法,我们可从其虚拟路径得到 Web 资源(如 .aspx 页面)的物理路径
+
+# 四、内置对象下
+
+## ==(1)Session对象==
+
+==Session对象用于存储用户的信息,此信息将在用户会话期间保留,当用户在同一应用程序中从一个页面浏览到另一个页面时,存储在Session对象中的变量不会被丢弃。==对象会在用户放弃会话或会话超时的时候被清除。
+
+#### ==**1.如何使用Session对象?**==
+
+对于一个Web应用程序而言,所有用户访问到的Application对象的内容是完全一样的;而不同用户会话访问到的Session对象的内容则各不相同。 ==Session可以保存变量,该变量只能供一个用户使用==,也就是说,==每一个网页浏览者都有自己的Session对象变量==,即Session对象具有唯一性。
+
+**典型应用:**
+
+- **不同数据之间需要传递较为复杂的数据**
+- **保存用户的登录信息,未登录者禁止访问相关页面**
+
+**Session对象的特点**:
+
+- Session对象包含特定的某个用户信息。此信息不能共享或由应用程序的其他用户访问。
+- 当用户向服务器发出请求时,用户D会在客户端和服务器之间传送。因此,在用户会话期间可以记录并监视用户的特定信息。
+- 当会话过期或终止时,服务器会自动清除Session对象。
+- ==默认保存会话20分钟==
+
+#### 2.Session应用和属性
+
+| 属性 | 说明 |
+| ------------------------------- | ------------------------------------------------------------ |
+| ==SessionID== | 包含一个唯一的用户会话标识符。它用于在会话过程中跟踪用户的信息。要检索 SessionID,Session.SessionID |
+| TimeOut | 设置用户超时,即它以分钟为单位指定 Session 对象在释放资源之前能够保持闲置的时间。用户可导航至另一个站点而不用关闭该应用程序。如果设定了超时属性,则无人操作的用户会话可被清除,由此释放服务器的资源。 默认值为 20 分钟。可通过在 ASPX 文件中赋值来更改此设置。例如,<% Session.Timeout = 10 %> |
+| LCID | 用于设置本地标识符。这可存储本地信息,如日期、货币和时间格式。列如,Session.LCID=0x040C见本地标识符设置为法国本地标识符 |
+| IsNewSession | 会话是否是与当前请求创建会话,那么该属性将返回True |
+| **方法** | **说明** |
+| Add(stirng name, object value) | 添加键值对 |
+| Remove(string name) | 根据键删除指定项 |
+| Clear() | 从会话状态集合中移除所有的键值 |
+| ==Abandon()== | 结束Session,取消当前会话 |
+
+#### 3.格式及使用
+
+**将新的项==添加==到会话状态中语法格式为:**
+
+```c#
+ Session ("键名") = 值
+ Session("sp")=text1.text;//是一个键值对,重复赋值会被覆盖
+ 或者
+ Session.Add( "键名" , 值)
+ Session.Add( "sp" , text1.text)
+```
+
+**批量赋值添加**
+
+```c#
+List car = new List();//可以创建一个泛型集合来装起来
+Session["sp"] = car;//现在它相当于一个泛型集合,那么以集合方式添加里面的值就不会被覆盖
+
+//调用:因为它不是集合.不出来Add所以需要强行转换
+((List)Session["sp"]).Add(i.Text);//把它当泛型集合来使用,用Add添加
+```
+
+```c#
+//按名称获取会话状态中的值语法格式为:
+ 变量 = Session ("键名")
+ 或者
+ 变量 = Session.Item("键名")
+
+//删除会话状态集合中的项语法格式为:
+ Session.Remove("键名")
+
+//清除会话状态中的所有值语法格式为:
+ Session.RemoveAll()
+ 或者
+ Session.Clear()
+
+//取消当前会话语法格式为:
+ Session.Abandon()
+
+//设置会话状态的超时期限,以分钟为单位。 语法格式为:
+ Session.TimeOut = 数值
+```
+
+#### ==4.添加之复选框==
+
+当你添加了多个复选框,需要多次用Checked去判断有没有选中,如果选中才进行强转添加
+
+普通判断:
+
+```c#
+if (ch1.Checked)//如果选中
+{
+ ((List)Session["sp"]).Add(c1.Text);
+}
+```
+
+批量判断:
+
+```html
+
+```
+
+```c#
+ foreach (var i in form1.Controls)//便利所有控件,form里面每一个类型都是control
+ {
+ if (i is CheckBox)//判断是否是复选框
+ {
+ CheckBox a = i as CheckBox;//是的话进行强转
+ if (a.Checked)//查找CheckBox,判断是否选中
+ {
+ lit.Text += a.Text + " ";//选中就赋值
+ }
+ }
+```
+
+********
+
+## (2)Cookie对象
+
+Cookie对象的特点:
+
+- 存储少量不重要的数据
+- 存储在客户端的文本文件中,(必须设置有效期,否则不被存储)
+- 安全性差
+- 存储的数据类型----字符串
+- 与浏览器窗口无关,但与访问站点有关
+- 具有特定的过期时间和日期
+- 在客户端存储后,将随着浏览器对相关网站页面请求一并发送到Web服务器
+
+#### 1.创建方法并使用
+
+注意:==创建Cookie使用Response,读取用Request==
+
+**创建方法一**
+
+```C#
+Response.Cookies["Cookie名"].Value = 变量值;
+```
+
+**创建方法二**
+
+```c#
+HttpCookie hc = new HttpCookie("Cookie名称","变量值");//创建一个名为Cookie名称的"CooKie",值为"变量值"。
+Response.Cookies.Add(hcCookie);//将新的CooKie添加到Response对象的CooKie集合中。
+
+//因此,会话CooKie是添加到浏览器的内存中,但并不记录在一个文件中。用户关闭浏览器后,CooKie也就从内存中清除了。
+```
+
+**设置有效期**:Expirs(到期)
+
+持久性Cookies经常用于存储用户名或用户ID等信息,这样当用户再次访问该网站时,服务器可识别出这一用户
+
+```c#
+Response.Cookies["Cok"].Expires = DateTime.Now.AddDays(1.0)
+//利用Expirs属性将CooKies过期时限设置为1分钟,按方法二创建添加的话一边是设置完再添加
+```
+
+**读取方法**
+
+```c#
+string 变量名 = Request.Cookies[Cookie名称].Value
+//通过访问Requst对象的Cookie集合可读取现有的Cookie,Value属性将Cookie的值以字符串形式返回。
+```
+
+我们在使用CooKie的时候需要酌情考虑如下限制:
+
+- CooKie不提供任何的安全保障,因为它由客户端系统控制,若用户禁止用CooKie,则它的存储功能就不能使用
+- 对于单个网站,浏览器最多可以容纳20个CooKie,而对于多个不同网站,操作系统最多可以容纳400个CooKie。
+- 单个CooKie变量可保留最多4KB的数据。
+
+******
+
+## (3)Application[应用]对象(浅看)
+
+Global.asax里的Application_Start比page_Load先运行
+
+Application对象的作用范围是整个全局,也就是说对所有用户都有效。它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session变量的区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。
+
+可能有人会问,既然所有用户都可以使用application变量,那他可以用在什么场合呢?这里举个例子:网站访问数。多个请求访问时都可以对它进行操作。
+
+优点:
+
+1. 使用简单,消耗较少的服务器资源。
+2. 不仅能传递简单数据,还能传递对象。
+
+3. 数据量大小是不限制的。
+
+
+缺点:作为全局变量容易被误操作。所以单个用户使用的变量一般不能用application。
+
+**使用方法:**
+
+在源页面的代码中创建你需要传递的名称和值构造Application变量
+
+```c#
+Application["Nmae"]="Value(Or Object)";
+```
+
+在目的页面的代码使用Application变量取出传递的值。
+
+```c#
+Result = Application["Nmae"]
+```
+
+注意:常用lock和unlock方法用来锁定和解锁,为了防止并发修改。
+
+```c#
+Application.Lock();
+//更改应用程序变量值的代码 Application["Visited"] = 0;
+Application.UnLock();
+```
+
+********
+
+# 五、基本控件使用
+
+## (1)Web服务器控件与HTML服务器控件
+
+```html
+
+
+
+```
+
+| HTML控件 | ASP.NET服务器控件 |
+| ------------------------------- | ---------------------------------- |
+| 运行在客户端 | 运行在服务器端 |
+| 没有回发,(无法使用ViewState) | 有回发,(ViewState) |
+| 使用JS完成事件处理 | 服务器完成事件处理(C#后台处理程序) |
+| 如果需要访问后台,使用JQuery | 事件驱动模型编程(控件+事件) |
+
+## (2)文本类型控件
+
+**主要用于在网页上呈现文字,这些控件可以分为只读的文本控件或接受用户输入的文本控件。**
+
+基本文本控件有:Label(标签)、 Literal(文字的)、TextBox(文本框)、HiddenField(隐藏域)
+
+#### 1.~~Label(标签)~~
+
+在页面上显示一个==静态文本==,其属性有:Text(文本)ForeColor(颜色) Visible(是否可见)
+
+```html
+
+```
+
+******
+
+#### 2.Literal(文字的)
+
+纯文本,不生成任何多于代码(推荐使用)
+
+```html
+
+```
+
+******
+
+#### 3.TextBox(文本框)
+
+**文本框控件,可以用于输入或者显示文本,通常用于可==编辑文本==(也可以设置为只读)。**
+
+**常用属性:**
+
+==ReadOnly==(只读):**获取或设置一个值,用于指示能否更改extBox控件的内容**
+
+==TextMode==(文本方式):**获取或设置TextBox控件的行为模式**:
+
+SingleLine(单行) MultiLine(多行) Password(密码)Maxlenth(文本长度)
+
+```html
+
+```
+
+******
+
+## (3)按钮类型控件
+
+**用于响应用户点击行为的控件。**
+
+常用的有:Button(按钮)、LinkButton(链接按钮)、ImageButton(图像按钮)、HyperLink(超链接)
+
+*****
+
+#### 1.Button(按钮)
+
+常用属性:
+
+- PostBackUrl[回发链接](跨页提交)
+- CommadName(按钮相关的命令名)
+- ==CausesValidation==(客户端验证):是否激活验证OnclientClick:引发Button控件的Click事件时所执行的客户端脚本
+- ==OnClientClick==:在单击Button按钮后应该询问用户是否确认这样的操作,如果用户误点那么就是一次无效的提交。
+
+加弹窗询问用户是否跳转:
+
+```html
+
+```
+
+```c#
+ protected void Button1_Click(object sender, EventArgs e)
+ {
+ //判断弹框是否确定,取消时 OnClientClick 为null
+ if (Button1.OnClientClick != null)
+ {
+ Response.Redirect("Page2.aspx");
+ }
+ }
+```
+
+*****
+
+#### 2.LinkButton(链接按钮)
+
+**超链接按钮控件,与上述Button类似,但在呈现的样式上不一样,它以超链接的形式显示。**
+
+**常用属性:**==PostBackUrl==该属性是用来设置单击控件时链接到的网页地址
+
+```html
+这是带链接的按钮
+```
+
+*****
+
+#### 3.ImageButton(图像按钮)
+
+**图像按钮控件,通常用于显示按钮的背景图像。**
+
+要新建一个项目,在项目里面新建一个文件夹,然后选择照片粘贴到这个文件夹当中。
+
+```html
+
+```
+
+*******
+
+#### 4.HyperLink(超链接)
+
+**超链接控件,功能上与HTML的超链接一致,当用户点击时并不会在服务器代码中引发事件,该控件只实现链接功能。==但是链接地址可以在后台动态改变==**
+
+通过:==NavigateUrl==属性
+
+(1)指定跳转方式:Target(目标)
+HyperLink控件的NavigateUrl属性用来设置要跳转到的地址。他有以下的跳转方式:Target
+
+```
+_self:默认的,在自身页面打开
+_blank:在新的页面上打开链接页
+_media或_search:将链接文档显示在新的空白窗口
+_parent或_top:将相应页面加到在单击该链接的窗口
+```
+
+```html
+HyperLink
+```
+
+*******
+
+## (4)选择类型按钮
+
+**选择类型控件是用于在一个集合列表中选中其中的一项或多项,这些控件中包含单选以及多选控件。**
+
+常用控件有:ListBox(列表框)、DropDownList(下拉框)、RadioButton(单选按钮)、CheckBox(复选框)
+
+#### 1.ListBox(列表框)
+
+**用于显示一组列表项,用户可以选择一项或多项。**
+
+##### a.添加项的方法:
+
+方法一:直接在拆分列表>编辑项->listletm集合编辑器添加
+
+方法二:控件属性页面的ietms也可添加
+
+方法三:在page_Load事件通过==ltems属性.add添加==
+
+```c#
+protected void Page_Load(object sender, EventArgs e)
+ {
+ if (!IsPostBack)
+ {
+ ListBox1.Items.Add("牛奶");
+ }
+ }
+```
+
+==批量添加?==:利用DataSource 属性
+
+```c#
+protected void Page_Load(object sender, EventArgs e)
+ {
+ if (!IsPostBack)
+ {
+ //集合
+ ArrayList list = new ArrayList();
+ list.Add("周一");
+ list.Add("周二");
+ //导入数据
+ list1.DataSource = list;
+ //数据
+ list1.DataBind();
+
+ //3.考虑搞个循环?
+ list1.Items.Add("周三");
+ list1.Items.Add("周四");
+ list1.Items.Add("周五");
+ list1.Items.Add("周六");
+ list1.Items.Add("周天");
+ }
+ }
+```
+
+##### b.属性
+
+| **属性** | **说明** |
+| ----------------------- | -------------------------------------------------------- |
+| Items[项目] | 获取列表控件项的集合 |
+| SelectionMode | Single 单选 Multiple 多选 |
+| SelectedIndex[选中下标] | 获取或设置列表控件中选定项的最低序号索引 |
+| SelectedItem[选中项] | 获取列表控件中选定项的最低序号索引 |
+| SelectedValue[选中值] | 获取列表控件中选定项的值,或选择列表控件中包含指定值的项 |
+| Rows | 获取或设置ListBox控件中显示的行数 |
+| DataSource | 获取或设置对象,数据绑定控件从该对象中检索其数据项列表 |
+| ID | 获取或设置分配给服务器控件的编程标识符 |
+
+##### c.两个标签实现选中下移
+
+```c#
+ protected void Button2_Click(object sender, EventArgs e)
+ {
+ //集合个数 count
+ int count = list1.Items.Count;
+
+ int index = 0;//下标为0
+ for (int i = 0; i< count; i++)
+ {
+ ListItem obj = list1.Items[index];//获取元素
+ if (obj.Selected)//判断元素是否选中
+ {
+ //int index = list1.SelectedIndex;
+ list2.Items.Add(obj);//添加
+ list1.Items.Remove(obj);//删除
+ index--;//下标递减,因为删掉选中的元素之后下面的元素会往上顶
+ }
+ index++;//没有选中就递增
+ }
+ }
+```
+
+*****
+
+#### 2.DropDownList(下拉框)
+
+**与上面的列表框控件大体类似,但是`DropDownList`==只允许用户每次从列表中选择一项==。所以它是下拉列表框。**
+
+**添加方法也与上面一样**
+
+| **名** **称** | **说** **明** |
+| -------------------- | ------------------------------------------------------------ |
+| AutoPostBack | 选择一个列表项时DropDownList控件状态是否发回到服务器的值(True/False) |
+| DataMember | 获取或设置数据源中的特定表格以绑定到该控件 |
+| DataSource | 获取或设置填充列表控件的组成项的数据源 |
+| DataTextField | 获取或设置提供列表项文本内容的数源的字段 |
+| DataTextFormatString | 获取或设置用于控制如何显示绑定到列表控件的数据的格式字符串 |
+| DataValueField | 获取或设置提供列表项文本内容的数据源的字段 |
+| Items | 获取或者设置选项的值 |
+| **事 件** | **说 明** |
+| SelectedIndexChanged | 当从列表控件选择的内容在发布到服务器的操作之间发生变化时发生 |
+
+****
+
+#### 3.RadioButton(单选框)
+
+**是一种单选按钮控件,可以在页面中添加一组`RadioButton`,每组都有相同的`GroupName(组名)`,每组只能选择一个选项。**
+
+**`Check`属性可以用来设置或者获取其选中的状态。定义控件直接设置,也可以在后台代码中进行设置**
+
+有多个单选框(RadioButtonList)要实现多选一,添加==GroupName==,名称要一致
+
+```html
+
+
+```
+
+##### a.Checked[选中]
+
+**Checked属性可以判断该单选框是否选中返回true或false**,可以拿来判断选择了哪一个单选框
+
+```c#
+if (rbtn1.Checked == true)//如果没有选择rbtn1这个单选框
+{
+ sex = "先生";
+}
+else
+{
+ sex = "女士";
+}
+```
+
+##### b.属性
+
+| **属 性** | **说 明** |
+| --------------- | ------------------------------------------------- |
+| AutoPostBack | 当选定内容更改后,自动回发到服务器 |
+| RepeatDirection | 获取或设置在RadioButtonList控件了子选项的排列方向 |
+| RepeatColumns | 获取或设置要在RadioButtonList控件中显示的列数 |
+| RepeatLayout | 获取或设置单选按钮的布局 |
+| Items | 列表中项的集合 |
+| TextAlign | 获取或设置与控件相关联文本的对齐方式 |
+
+*****
+
+#### 4.CheckBox(复选框)
+
+**用来显示设置为`true`或`false`的复选框。一组中可选择单个或多个。**
+
+**它也有==Checked==属性可以判断该单选框是否选中返回true或false**,可以拿来判断选择了哪一个复选框
+
+##### a.**批量判断**:
+
+```c#
+b foreach (var i in form1.Controls)//便利所有控件,form里面每一个类型都是control
+ {
+ if (i is CheckBox)//判断是否是复选框
+ {
+ CheckBox a = i as CheckBox;//是的话进行强转
+ if (a.Checked)//查找CheckBox,判断是否选中
+ {
+ lit.Text += a.Text + " ";//选中就赋值
+ }
+ }
+```
+
+##### b.属性
+
+| **属 性** | **说 明** |
+| --------------- | ------------------------------------------ |
+| AutoPostBack | 当选定内容更改后,自动回发到服务器 |
+| RepeatColumns | 获取或设置CheckBoxList中显示的列数 |
+| RepeatDirection | 获取或设置CheckBoxList中各个选项的排列顺序 |
+| Items | 列表中项的集合 |
+| TextAlign | 获取或设置与CheckBoxList关联文本的对齐方式 |
+
+******
+
+## (5)页面弹窗
+
+```c#
+ Response.Write("");//script:脚本 alert:警惕
+```
+
+******************
+
+# 六、验证控件
+
+ASP.NET提供了6种验证控件,这些控件不但可以使程序员轻松地实现==对用户输入的验证==,而且还可以选择验证在服务器端进行还是在客户端进行。
+
+使用验证控件首先要在 Page_Load下写入,否则会报错
+
+```c#
+UnobtrusiveValidationMode = UnobtrusiveValidationMode.None;
+```
+
+## (1)数据的有效验证方式
+
+1. 编写C#后台代码
+
+ 使用页面回传,用户体验不好,服务器压力大
+
+2. 编写Js脚本进行自定义
+
+ 验证方式可以自定义,但编写较为麻烦
+
+3. ASP.NET的验证控件
+
+ 验证简单,方便;安全性高
+
+4. 使用jQuery验证插件
+
+ 使用简单,高效。用户体验良好
+
+## (2)非空验证:RequiredFieldValidator控件
+
+**该控件在web窗体中,皆在检查任何特定控件中是否录数据。如果控件中不含任何值,则将显示程序员设定的错误消息。此控件通常与TextBox控件一起使用。==TextBox可以通过CausesValidation="False"来设置是否激发控件==**
+
+| **属** **性** | **说** **明** |
+| ----------------- | ------------------------------------------------------------ |
+| ControlToValidate | 用于==指定将要检查其值的控件==,它具有该控件的ID值 |
+| ErrorMessage | 用于指定在窗体中同时使用ValidationSummary控件与RequierdFieldValidator控件时前者中显示的错误信息。如果未设置文本属性,则此属性将==用于显示窗体中的错误 == |
+| ForeColor | 错误提示文字颜色 |
+| 方 法 | 说 明 |
+| Validate | 此方法用于执行验证。它将根据验证的成功情况将IsValid属性更改为True或False |
+
+******
+
+## (3)比较控件:CompareValidator控件
+
+**该控件用于将用户在一个窗体字段中输入的值与其他字段中的另一个值或任何其他固定的值进行比较。所输入任何类型的数据(即字符、数字或日期类型的数据均可相互比较)**
+
+| **属** **性** | **说** **明** |
+| -------------------- | ------------------------------------------------------------ |
+| ==ContrlToCompare== | ==指定用来比较值的控件的ID== |
+| ==ContrlToValidate== | ==指定将要验证的控件的ID== |
+| ==ErrorMessage== | 在页面中使用ValidationSummary控件时显示错误消息 |
+| Text | 用于指定验证控件后出现错误时将会显示的错误信息 |
+| ==ValueToCompare== | 指定与所验证控件中的值相比较的值 |
+| 方 法 | 说 明 |
+| Validate | ==执行验证==,它将根据验证的成功情况将IsValid属性更改为True或False |
+| Operator | 执行的操作类型 |
+
+## (4)范围验证:RangeValidator控件
+
+**该控件用于检查用户在窗体字段中输入的值是否介于最小值和最大值之间。可以用来比较日期、号码、货值或字符串**
+
+| **属 性** | **说 明** |
+| ----------------- | ------------------------------------------------------------ |
+| ControlToValidate | 指定将要检查其值的控件,它具有该控件的ID值 |
+| ErrorMessage | 指定在页面中使用ValidationSummary控件时该控件中显示的错误消息 |
+| MaximumValue | 指定容许为此控件设置的最大值 |
+| MinimumValue | 指定容许为此控件设置的最小值 |
+| Type | 设置控件所验证的数据类型 |
+
+********
+
+## (5)验证错误汇总:ValidationSummary控件
+
+**该控件用于显示窗体中各种验证插件生成的所有错误的汇总,此摘要可显示在窗体的任意部分,一般情况下显示在窗体的顶端**
+
+| **属** **性** | **说** **明** |
+| --------------- | ------------------------------------------------------------ |
+| DisplayMode | 此属性用于指定将以摘要形式显示错误消息的方式。它将以为下列任意一种方式:BulletList、或SingleParagraph |
+| Enabled | 用于启用或禁用窗体中的客户端和服务器端验证。默认值为True |
+| ShowMessageBox | 此属性用于激活弹出式消息框,以便显示窗体中的错误。为此必须将其设置为True,若为False则在页面列出错误点 |
+
+*************
+
+# 七、数据库连接
+
+## (1)ADO.NET概述
+
+ADO.NET 是在 .NET 平台上访问数据库的组件。
+
+ADO.NET 是以 ODBC (Open Database Connectivity) 技术的方式来访问数据库的一种技术。
+
+ADO.NET 中的常用命名空间如下表所示。
+
+| 命名空间 | 数据提供程序 |
+| ------------------------- | -------------------- |
+| **System.Data.SqlClient** | Microsoft SQL Server |
+| System.Data.Odbc | ODBC |
+| System.Data.OracleClient | Oracle |
+| System.Data.OleDb | OLE DB |
+| ==System.Data;== | |
+| ==System.Data.Common;== | |
+
+
+
+## (2)ADO.NET访问SQL数据库常用类:
+
++ ==SqlConnection== 数据库连接对象
++ ==SqlCommand== 数据库命令对象
++ ==SqlDataReader== 数据读取器
++ ==SqlDataAdapter== 数据适配器,填充数据到DataSet
++ DataSet 数据容器,将得到的数据复制一份保存到内存中,极大地减少了数据库服务器的压力。
++ ==DataTable== 数据表容器,在内存中存储一张表的数据。可以将其添加到DataSet中作为其中的一个对象。
+
+
+
+## (3)数据库的查询和增删改操作
+
+利用ADO.NET提供的程序类,编写DBHelper类:
+
+1. GetData(string sql)方法:根据查询的sql语句获取数据库中的数据;参数为查询的sql字符串,返回的是一个DataTable类的数据表对象。
+2. ExecuteSql(string sql)方法:使用SqlCommand对象,对数据库执行非查询类的sql语句(增删改),返回执行sql后对数据库的影响行数。
+
+```c#
+///
+/// 创建DBHelper类使用ADO.NET提供的程序类完成对数据库的操作
+///
+public static class DBHelper
+{
+ //创建数据库连接字符串
+ static string connetString = "server=.;database=UserDB;uid=sa;pwd=123456;";
+
+ ///
+ /// 根据sql语句获取数据库的结果集数据,并返回存储结果集的数据表对象
+ ///
+ /// 要在数据库中执行查询的sql语句
+ /// 一个DataTable对象,该对象存储查询结果集
+ public static DataTable GetData(string sql)
+ {
+
+
+ //创建DataAdapter对象,作为适配器;用其Fill在数据库执行查询的sql语句,并将查询结果填充到数据集或数据表对象中
+ SqlDataAdapter adapter = new SqlDataAdapter(sql, connetString);
+
+ //定义DataTable存储查询结果集,该对象将查询的结果数据存储在内存中
+ DataTable dt = new DataTable();
+
+ //用DataAdapter类的Fill方法将数据库的查询结果集存放到对象dt中,dt对象是存放在内存中的数据表,可以离线操作数据库数据
+ adapter.Fill(dt);
+
+ //返回存储查询结果的对象dt
+ return dt;
+ }
+
+ ///
+ /// 使用SqlCommand类,在数据库中执行操作类的sql语句
+ ///
+ /// 要执行的非查询的Sql语句
+ /// 返回数据库执行sql语句后的影响行数,大于0操作成功
+ public static int ExecuteSql(string sql)
+ {
+
+ int result = 0;
+
+ //使用数据库连接字符串,创建SqlConnection类对象,用于连接数据库
+ SqlConnection connection = new SqlConnection(connetString);
+ //打开数据库:调用SqlConnection类的Open方法,打开数据库
+ connection.Open();
+
+ //创建数据库操作对象:使用SqlCommand类实例化该对象,通过该对象对数据库执行sql语句;
+ //初始化参数为要执行的sql语句和连接对象
+ SqlCommand command = new SqlCommand(sql, connection);
+
+ //调用SqlCommand类ExecuteNonQuery方法,在数据库中执行该对象中的sql语句;
+ //ExecuteNonQuery方法返回sql语句执行后的影响行数;
+ result = command.ExecuteNonQuery();//result保存ExecuteNonQuery方法返回的影响行数
+
+ //关闭数据库:调用SqlConnection类的Close方法,关闭数据库
+ connection.Close();
+
+ //将执行sql后的影响行数返回给调用该方法的地方,用于判断是否操作成功;
+ return result;
+ }
+
+}
+```
+
+## (4)登录与注册练习步骤
+
+**登录页面-web按钮**
+
+**1.接收数据**
+
+**2.查询语句**:string
+
+**3.1创建新的数据验证类**(DataTable=验证类的查询方法):前提是已经有一个数据验证类和查询方法
+
+**4.检查用户密码是否正确**:验证类.rows.count验证类的长度是否等于1
+
+#### ==**3.创建数据验证类**==
+
+新建一个文件夹->创建一个静态类
+
+```c#
+1.创建数据库连接字符串:静态
+2.查询方法:静态(查询语句)
+2.1创建DataAdapter[数据适配器]对象,作为适配器:(查询语句,连接语句)
+2.2新建一张空表:DataTable[数据表]
+2.3填充数据:数据适配器.Fill(空表)
+2.4返回填充后的表
+
+3.添加查询操作方法:实现增删改:静态(查询语句)
+3.1连接数据库:SqlConnection[sql连接ion](连接语句)
+3.2打开数据库
+3.3创建命令对象SqlCommand(搜索语句,链接数据库)
+3.4定义返回受影响行数ExecuteNonQuery
+3.5关闭数据库
+```
+
+**注册页面**
+
+1.接收数据
+
+2.插入语句
+
+3.返回请求语句:int c=验证类的增删改方法
+
+4.判断语句是否添加成功 c>0
+
+**********
+
+# 八、ADO.NET详解
+
+## (1)ADO.NET简介
+
+**ADO.NET通过数据处理将数据访问分解为多个可以单独使用或者一前一后使用的不连续组件。**
+
+**常用的命名空间**
+
+| 命名空间 | 数据提供程序 |
+| ------------------------- | -------------------- |
+| **System.Data.SqlClient** | Microsoft SQL Server |
+| System.Data; | |
+| System.Data.Common[共同]; | |
+
+| .NETFramework数据提供程序 | | |
+| ------------------------- | ---- | ------------------------------------------------------------ |
+| Connection[连接]对象 | | ==DataSet==[数据设置] |
+| Command[命令]对象 | ←→ | DataTableCollection |
+| DataReader[读取器]对象 | | DataRelationCollection |
+| DataAdapter[适配器]对象 | | ==DataTable== |
+| ↑↓ | | 数据表容器,在内存中存储一张表的数据。可以将其添加到DataSet中作为其中的一个对象。 |
+| **数据库** | | |
+
+******
+
+## (2)ADO.NET对象
+
+**ADO.NET主要包括Connection、Command、DataReader、DataSet、DataAdapter对象。**
+
+因为是对sql数据库进行操作所有对象前加sql,参数有连接对象必须要打开和关闭数据库
+
+| **对象** | **简介** |
+| --------------------------------- | ------------------------------------------------------------ |
+| ==Connection(连接语句)== | 主要提供与数据库的连接功能 |
+| ==Command(sql命令,连接对象)== | 用于返回数据、修改数据、运行存储过程、以及发送或检索参数信息的数据库命令 |
+| DataReader[数据读取器] | 通过Command对象提供从数据库检索信息的功能。以只读的,向前的,快速的方式访问数据库。 |
+| DataSet[数据设置] | 中心概念,支持ADO.NET断开式、分布式的数据方案的核心对象。是一个数据库容器,可以把它当作内存当中的数据库。DataSet是数据的内存驻留表示形式,无论数据源是什么,它都会提供一致的关系编程模型;它可以用于多种不同的数据源,如用于访问XML数据或用于管理本地应用程序的数据 |
+| ==DataAdapter(sql命令,连接语句)== | 提供连接DataSet对象和数据源的桥梁,它使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并确保DataSet中的数据更改与数据源一致。 |
+
+#### 1.Connection[连接]对象
+
+| **参数** | **说明** |
+| --------------------------------- | ------------------------------------------------------------ |
+| Connection Timeout | 在终止尝试并产生异常前,等待连接到服务器的连接时间长度。 |
+| ==Initial Catalog 或 Database== | 数据库名称 |
+| ==Data Source 或 Server== | 连接打开时使用的SQL Server名称(.) |
+| ==Password 或 pwd== | SQL Server登录密码 |
+| ==User ID 或 uid== | SQL Server用户名 |
+| Integrated Security | 此参数决定连接是否为安全连接,可能的值有true、false和SSPI(SSPI是true的同义词) |
+
+连接语句:因为封装特性的关系==不推荐直接把连接语句==写进sqlconnection对象,==建议写成一个string类型==,这样子要执行其他sql命令时只要传新的String语句进去
+
+```c#
+SqlConnection con = new SqlConnection(“Server=服务器名; User Id = 用户; pwd=密码; DataBase=数据库名称”);
+```
+
+##### a.连接本地SQL Server
+
+```c#
+ //创建连接数据库的字符串
+ string conStr = "server=.;uid=sa;pwd=123456;database=UserInfo";//顺序无所谓
+ //1.创建Sqlconnection对象
+ SqlConnection con = new SqlConnection(conStr);
+ //2.打开数据库的连接
+ con.Open();
+ //3.数据库相关操作:查询,非查询(增删改)
+
+ //4.关闭数据库的连接
+ con.Close();
+```
+
+*******
+
+#### 2.Command[命令]对象
+
+**==使用Connection对象与数据源建立连接后,可使用Command对象对数据源执行查询、添加、删除和修改==**
+
+==**等各种操作,操作实现的方式可以是使用SQL语句,也可以是使用存储过程。**==
+
+| **属性** | **说明** |
+| -------------- | -------------------------------------------------------- |
+| CommandType | 获取或设置Command对象要执行命令的类型 |
+| CommandText | 获取或设置要对数据源执行的SQL语句、存储过程名或表名 |
+| CommandTimeOut | 获取或设置在终止对执行命令的尝试并生成错误之前的等待时间 |
+| ==Connection== | 获取或设置此Command对象使用的Connection对象的名称 |
+| ==Parameters== | 获取Command对象需要使用的参数集合 |
+
+| **方法** | **说明** |
+| ------------------------------- | ------------------------------------------------------------ |
+| ==ExecuteNonQuery==[执行非查询] | 执行SQL语句并==返回受影响行数==: 增删改,返回的是一个SqlDataReader |
+| ==ExecuteReader==[执行读取] | 执行返回数据集的Select语句: ==查== |
+| ==ExecuteScalar==[执行标量] | 执行查询,并返回查询所返回的结果集中第1行的第1列,==用于聚合函数== |
+
+##### a.使用Command对象增删改数据和EndExecuteNonQuery
+
+步骤:
+
+1. 创建SqlConnection对象连接数据库
+2. 定义SQL字符串(查询语句)
+3. 查看结果(影响行数)
+
+```c#
+ //1.创建连接数据库操作
+ SqlConnection con = new SqlConnection(conStr);
+
+ //2.打开数据库的连接
+ con.Open();
+
+ //3执行非查询的Sql语句
+ SqlCommand command = new SqlCommand(Sql,conStr);
+
+ //4.获取返回结果
+ int result = command.EndExecuteNonQuery();//返回影响行数
+
+ //5.关闭数据库的连接
+ con.Close();
+
+ //6.返回受影响行数
+ return result;
+```
+
+******
+
+## (3)ADO.NET连接数据库的两种方式
+
+==**1.连接式访问:整个操作过程中需要保持数据库的连接。(DataReader)**==
+
+
+
+**==2.断开式访问:只需要在执行数据库命令时保持数据库连接。(DateAdapter)==**
+
+**内存里有:DataSet、==DataTable==和表与表的关系**
+
+*******
+
+## (4)抽象类==DataReader==[读取器]
+
+**使用DataReader读取数据属于连接式读取,只能只进的==一行一行读取数据==,==并且不能改变数据==,**
+
+**如果需要改变数据,必须重新执行insert,update,delete等sql语句来改变数据。**
+
+==使用方式:由于抽象类不能实例化,所以只能通过:command对象的ExecuteReader()方法返回SqlDataReader。==
+
+#### ==1.ExecuteReder和Read[行数]方法==
+
+**Read():如果有下一行,返回true,如果是最后一行,返回一个false**
+
+DataReader读它只能一行一行的读,所以我们可以使用while循环
+
+```c#
+ SqlDataReader dr = cmd.ExecuteReader();//此处cmd是SqlCommand,里面是查询语句
+ // dr.Read():如果有下一行,返回true,如果是最后一行,返回一个false
+ while (dr.Read())
+ {
+ Literal1.Text += dr["uName"].ToString() + " " + dr["upwd"].ToString() + "
";//提取数据
+ //dr是一个索引器,运行结果是把表里面的数据全部输出
+ }
+```
+
+==但是我们一般不用它,假设我们浏览淘宝的话,要搜索一些商品,但是它是一行一行的读取出来(就是每一次只显示一条消息),人会等麻掉==,==所以我们查的使用DataAdapter==,把你整张的一个查询的数据直接调入内存里(全部)
+
+******
+
+## (5)==DataAdapter==[适配器]
+
+是断开式连接:
+
+**连不连接区别于构造方法**:一般使用不连接的构造
+
+- DataAdapter(sql命令语句,string连接语句):**==不需要连接==不用打开数据库连接**,**直接使用**
+- DataAdapter(sql命令语句,连接对象):**需要连接**,用到连接对象要打开和关闭连接
+
+#### 1.DataTable对象和Fill方法
+
+1.它是一个抽取式的:你执行了server语句,DataAdapter通过server语句返回一张表,把表直接抽取到内存(返回是DataTable),直接显示在你的页面上
+
+3.==Fill[填充]方法==:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。(把抽取过来是数据填充进表)
+
+2.所以我们需要新建一张空表:DataTable
+
+4.填充完之后想干什么是==针对表对象进行操作==
+
+******
+
+#### 2.DataTable的属性
+
+DataTable有==Rows和count属性==:
+
+##### a.Rows
+
+Rows[行数]是一个集合可以增删改==查==,Rows[index]:此处返回DataRows说明是第几行
+
+这个才是数据:Rows[index] [index/键]:分别为行和列,列可以用下标和键(列名)
+
+行的下标如果固定的话只能查那行数据所以要进行判断
+
+##### b.count
+
+是统计你有几行数据的意思,如果没数据就是0行
+
+```c#
+//根据账号查询密码等信息
+ string conStr = "server=.;uid=sa;pwd=123456;database=UserInfo";
+ //1.新建Adp对象
+ string name = TextBox1.Text;//接收用户名
+ string sql = $"select * from UserAccount where uname='{name}'";
+ SqlDataAdapter adp = new SqlDataAdapter(sql, conStr);
+
+ //2.新建一张空表
+ DataTable dt = new DataTable();
+ //3.将虚拟表填充到dt
+ adp.Fill(dt);
+
+ //4.数据相关操作
+ if (dt.Rows.Count == 0)//如果没有数据
+ {
+ Response.Write("");
+ }
+ else
+ {
+ Literal1.Text = dt.Rows[0]["upwd"].ToString();//把你的数据转换为字符串
+ //此处进行一个改密码的操作,老土的操作不需要掌握,换成用sql命令语句操作
+ dt.Rows[0]["upwd"] = "123465789798";//更改密码
+ SqlCommandBuilder cb = new SqlCommandBuilder(adp);//命令生成器(适配器)
+ //回写
+ adp.Update(dt);//更新数据
+ }
+```
+
+******
+
+## (6)DataSet
+
+==这个学期主要掌握DataTable==
+
+- DataSet是特意为独立于所有数据源的数据访问而设计的,可以理解成内存中的数据库。在支持ADO.NET的断开式,分布式数据方案中起着重要作用。
+- DataSet是数据驻留在内存中的表现形式,无论是什么数据源,它可以提供一致的变成模型。
+- DataSet支持改变数据然后回传给数据库。
+
+******
+
+## (7)步骤与总结
+
+| | 1.conStr字符串 : 连接数据库sql | |
+| ------------------------------- | --------------------------------------------- | --------------------- |
+| | 2.**SqlConnnection con 连接数据库con.Open()** | |
+| | 3.**打开数据库连接con.Open();** | |
+| | 4.**//数据库相关操作**: | |
+| ↙ | 5.Command或SqlDataAdapter | ↘ |
+| SqlCommand cmd:增加,删除,修改 | 6. | DataAdapter :查询操作 |
+| ↘ | | ↙ |
+| | 7..**获取返回结果** | |
+| | 8..**关闭数据库连接Con.Close;** | |
+| | | |
+
+************
+
+# 九、**GridView**的基本使用
+
+## (1)数据源控件简介
+
+ ASP.NET 包含一些数据源控件,这些数据源控件允许您使用不同类型的数据源,如数据库、XML 文件或中间层业务对象。数据源控件连接到数据源,从中检索数据,并使得其他控件可以绑定到数据源而无需代码。数据源控件还支持修改数据。
+
+数据源控件模型是可扩展的,因此您还可以创建自己的数据源控件,实现与不同数据源的交互,或为现有的数据源提供附加功能。
+
+- 快速实现多种常用的数据源进行展示和交互
+- 快速完成对数据表增删改查操作
+- 是ASP.NET引入的一个新的数据抽象层
+
+| 数据源控件 | 简介 |
+| ----------------- | ------------------------------------------------------------ |
+| AccessDataSource | 允许您使用 *Microsoft Access* 数据库。当数据作为 DataSet对象返回时,支持排序、筛选和分页。以表格的形式进行数据展示,有自带分页,支持删、改、排序、分页外观设置以及自定义显示数据 |
+| LinqDataSource | 使用此控件,可以通过标记在 *ASP.NET* 网页中使用语言集成查询 *(LINQ)*,从数据对象中检索和修改数据。支持自动生成选择、更新、插入和删除命令。该控件还支持排序、筛选和分页。 |
+| ObjectDataSource | ==允许您使用业务对象或其他类==,以及创建依赖中间层对象管理数据的 *Web* 应用程序。支持对其他数据源控件不可用的高级排序和分页方案。 |
+| SiteMapDataSource | 结合 ==*ASP.NET* 站点导航==使用。 |
+| SqlDataSource | ==允许您使用 *Microsoft SQL Server*、*OLE DB*、*ODBC* 或 *Oracle* 数据库==。与 *SQL Server* 一起使用时支持高级缓存功能。当数据作为 DataSet 对象返回时,此控件还支持排序、筛选和分页。 |
+| XmlDataSource | ==允许使用 XML 文件==,特别适用于分层的 ASP.NET 服务器控件,如 TreeView 或 Menu 控件。支持使用 XPath 表达式来实现筛选功能,并允许您对数据应用 XSLT 转换。XmlDataSource 允许您通过保存更改后的整个 XML 文档来更新数据。 |
+
+## (2)数据绑定控件简介
+
+数据绑定是ASP.NET提供的另一种访问数据库的方法。数据绑定技术可以让程序员不关注数据库连接、数据库命令以及如何格式化这些数据以显示在页面上的环节,而是直接把数据绑定到HTML元素和Web控件。数据控件则是用来显示从数据军中获取的数据
+
+**数据绑定控件分为:**
+
+1. 列表控件
+2. 表格控件
+3. 层次控件
+
+**数据绑定控件简介:**
+
+| 数据绑定控件 | 描述 |
+| ------------ | ------------------------------------------------------------ |
+| GridView | 以表格的形式进行数据展示,有自带分页,支持删、改、排序、分页外观设置以及自定义显示数据 |
+| DetailsView | Details View控件以表格形式显示数据,且一次仅显示数据源的单条记录,并且 table标签下的每行( tr标签)表示记录中的一个字段。这个控件同样支持数据的编辑、插入和删除操作,并可以轻松地设置分页功能 |
+| FromView | Form View控件与DetailsView控件很相似,Form View控件仅可显示数据源中的单条记录 |
+| Repeater | Repeater控件是一个数据绑定容器控件,用于生成各个子项的列表,这些子项的显示方式可以完全由编程者自己编写,不支持分页、排序和编都、仅提供重复模板内容 |
+| DataList | DataList 控件,类似于Repeater控件,用于显示限制于该控件的项目的重复列表。不过,DataLis t控件会默认地在数据项目上添加表格,且具有内置样式设置 |
+| DropDownList | 下拉数据绑定控件 |
+| TreeView | 以可展开节点的分层数形式呈现数据 |
+| Menu | 在可以包括子菜单的分层动态菜单中呈现数据 |
+
+*****
+
+## (3)GridView控件
+
+使用GridView 控件可以完成下面的功能:
+
+- 通过数据源控件将数据绑定到GridView 控件。
+- 对GridView 控件内的表格数据进行选择、编辑和删除操作。、
+- 对GridView 控件内的表格数据进行排序。
+- 对GridView 控件内的数据进行分页显示。
+- 通过指定GridView 控件的模板列,创建自定义的用户界面。
+- 通过GridView 控件提供的事件模型,完成用户复杂的事件操作。
+- 可以自定义数据显示的列和行的显示风格。
+
+#### 1.数据行类型
+
+GridView控件以表格形式显示从数据源中获取的数据集合。作为一个由GridView控件呈现的表格,其基本组成元素是数据行。根据行所处的位置、实现的功能等,==数据行可以分为8种类型:表头行、交替行、空数据行、选中行、编辑行、数据行、表尾行、分页行==
+
+为了提高灵活性,GridView控件将这些数据行作为对象来处理。所有数据行对象,其类型是GridViewRow。另外,对于不同的数据行,GridView还定义了不同的对象实现访问。例如,对于表头行,使用HeaderRow对象;对于表尾行,使用FooterRow:对于选中行,使用SelectedRow对象;对于分页行,使用TopPagerRow和BottomPagerRow对象。通过编程方式,可以访问和处理这些GridViewRow类型对象。
+
+#### 2.数据绑定列类型
+
+GridView控件是用来展现的表格控件,它的列一共分为7种不同的类型,每个类型的列适用的场景各不同,表6-3中列出了可以使用的不同列类型。
+
+==**绑定方法:通过设计页面>选择数据源等-->编辑列选择字段(请看3.1)-->设置属性**==//去掉勾选自动生成字段可以去掉
+
+==BoundField:==该类型列应用比较广泛也比较简单,它直接绑定到数据库中的某个字段,完成该字段在表格中的显示。
+
+******
+
+==HyperLinkField==:将数据源中的某个字段显示为超链接的形式,链接中可以将其他列的数据信息格式化到该链接参数中,来组成链接的参数。
+
+******
+
+ButtonField:可以创建自定义的按钮事件,通过事件的触发,完成自定义的业务逻辑。
+
+*******
+
+- CheckBoxField:将数据源中的布尔类型,以CheckBox的形式显示出来,所以它只能用来显示布尔类型的数据。
+
+- CommandField:提供了已经定义好的选择、编辑、更新、取消操作,每种操作只需要稍加配置就可以完成数据操作。CommandField提供的功能也可以通过BoundField列来完成。可以理解为CommandField是ButtonField已经封装好的子类型。
+
+- ImageField:提供了图片的URL地址属性,可以将表格中某一列展现为图片。
+- TemplateField:可以放置多种控件,可以通过该类型的列,实现表格中显示下拉列表、复选框等复杂的需求。
+
+******
+
+## (4)数据的显示
+
+
+
+
+