您当前的位置:KKBlog > 学无止境 > ASP.NET

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>
喜欢
二维码
意见反馈 二维码