zoukankan      html  css  js  c++  java
  • Asp.Net2.0开发功能概览

    我顶 字号:
    一、ASP.NET创建网站的两种方式:
        文件系统:VS2005新增的模式,不需要安装IIS,使用内置的"ASP.NET程序开发服务器",并且随机给网站分配一个Port。
        本地IIS:传统的Web开发模式,使用操作系统的IIS服务器。
    二、Web开发环境:
        1、 解决方案的设置:在VS2005中当建立一个网站的时候会发现只有网站项目,不像VS2003中会自动出现一个"解决方案",除非你添加第二个项目的时候“解决方案”才会显示出来。  
                用户可以从<工具>-<选项>-<项目和解决方案>中将“总是显示解决方案”打勾,即可将解决方案显示出来。
        2.、对单页进行编译:在VS2003中对网站中某一页面的小小改动也要对整个网站进行整体编译,在VS2005中可以针对某一页进行编译.
                在相应的页面上右击选择<生成页>即可。
        3、开发界面模式:在VS2005中承延了VS2003中的两种开发界面“设计模式”和“代码模式(源文件模式)”。系统默认的是“源文件模式”。
                <工具>-<选项>-<HTML设计器>-<起始页位置>中选择地“设计视图”。
        4、页面布局的设置:在VS2003中Web页面的布局默认是GridLayout绝对定位模式,开发时候给人一种很不舒服的感觉,在VS2005中把默认的Web页的布局设为FlowLayout相对定位模式,如果你想把页面默认布局设为绝对定位的话,进行如下操作:
                <工具>-<选项>-<HTML设计器>-<CSS定位>中选中“绝对定位”
        5、显示不可见的元素:有一些不可见的元素如<span><div>等,默认不会在设计视图中显示出来。
                <工具>-<选项>-<HTML设计器>-<显示>中选中“显示不可见元素的详细信息”。
        6、行号设置:<工具>-<选项>-<文本编辑器>-<所有语言>将“行号”选择。
        7、以文件系统开发时把端口号固定:在以文件系统开发时,系统自动生成的端口号是随机的,这给我们运行程序带来了困难,如何将端口号固定下来呢?
               a. <工具>-<外部工具>-<添加>,输入下列设置
               标题:MyWebServer
               命令:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\WebDev.WebServer.EXE
               参数:/port:8080 /path:$(ProjectDir) /vpath:"/websit2"
               b.点击<工具>-<MyWebServer>启动Web服务器
               c.右击项目,选择<启动选项>-<使用自定义服务器>在后面的输入框中输入"http://localhost/8080"
               d.运行项目,这样就可以在固定的端口下运行项目了。
        8、代码段
                用过JCreator的朋友可能感觉里面的代码模板实在是太好用了,有人问VS中有没有这样的功能。当初在VS2003的时候我也曾为此遗憾过,但到了VS2005中我们兴奋地发现“代码段”就是我们要找的那种功能。
                右击选择“插入代码段”,或者按Ctrl+K+X就会列出我们要找的代码段,当然还可以去网上下载更多的代码段,或自己扩充代码段。
        9、代码的重构:             
                代码重构不是代码的重写,它是对现有的代码进行重新组织或调整。如:把某段代码提取出来放在一个独立的方法中,重命名某个方法及其引用者,将方法中的局部变量变为实参的参数等等。
                选中相应的代码段,右击选择“重构”再选择要应的重构方式。
        10、同一项目中使用VB.Net和C#同进开发
                在VS2003中对于一个项目,只能使用一种开发语言进行开发。到了VS2005中我们可以对一个项目使用不同的开发语言,但这并不意味着在一个.cs类文件中可以混合使用各种的开发语言。
                要在一个项目中实现不同的开发语言共存
               a.需要在App_Code文件夹中建立不同的子文件夹(如文件夹cs和文件夹vb),把不同语言的开发代码分别放在不同的子文件夹中.
               b.在配置文件中进行如下配置:
                 <compilation debug="true">
                  <codeSubDirectories>
                    <add directoryName="cs"></add>
                    <add directoryName="vb"></add>
                  </codeSubDirectories>
                </compilation>  
             
               c.在相应的文件夹中用不同的开发语言编写代码。
               这样就可以在外面使用C#类或VB.Net类了
    三、安装布署:
       1、复制网站
            在VS2003中的xcopy给开发人员的布署带来了很大的方便,但仍有不足之处。在VS2003中编译后的.dll文件是程序运行的文件,也为源代码保护提供了方便,但正因为运行的是.dll文件,所以,当源代码发生改变后必须要编译整个网站生成新的.dll文件,并把编辑出的.dll文件和新的.aspx文件Copy到服务器上才可以,这给网站的维护带来了很大的不便。
            在VS2005中提供了“复制网站”的工具,可以把整个程序发布到本地或远程的IIS上,另外它还带有同步处理的功能,如果网站发生改变,你只需要同步处理一下就可以了。
            在网站项目上右击,选择<复制网站>-<连接>-<本地IIS>-<创建新的Web应用程序>,将“源网站”的所有文件同步复制到“远程网站”上去就可以了,程序在第一次运行的时候会自动编译网站的.aspx和.cs文件。
       2、预编译:
            “复制网站”可以实现简单快速的布署,有心的朋友可能会发现这种布署方式会把程序源文件(.cs)文件一起发布到服务器上,并且找不到编译出的.dll文件,因为在“复制网站”的布署方式中,会在第一次运行的时候动态编译.aspx和.cs文件生成中间语言元数据,然后再生成页面对象。那VS2005如何做到源代码的保护呢?这时会有很多朋友怀念VS2003的编译模型,在第一次编译的时候就生成中间语言元数据,在VS2003中只需要把生成的.dll文件和.aspx文件布署就可以了,如此实现了对源代码的保护。
            其实不用担心,VS2005是不会犯这种弱智的Bug。VS2005采用预编译的方式来实现源代码保护的,并且应用程序在第一次动行的时候省去一次编译的,达到更快的效果。
            在VS2005的Dos窗口下运行aspnet_compiler -v webs "c:\temp\newwebs"
                -v 后的第一个参数(webs):是要预编译的虚拟目录
                -v后的第二个参数("c:\temp\newwebs") :是预编译后结果所存放的目标位置
            预编译完成后,就可以在目标位置中查看编译结果,发现里面没有.cs文件,只剩下aspx文件,并且多出了一个bin文件夹。当你打开aspx文件后会发现它也被编译了,无法查看和修改。可见预编译比VS2003中的编译更深入。
           最后你就把编译的结果放Copy到服务器的虚拟目录中就可以了。
        3、发布网站:
            预编译效果不错,担操作有点复杂,其实VS2005提供了预编译的简单操作,右击Web项目,选择“发布网站”按照向导进行操作即可,这样就会像复制网站一样简单,可以轻松实现预编译,并把预编译的结果发布到Web服务器上去。       
    四、CodeBehind模式的改进:
        在VS2003中一个耀眼的亮点就是CodeBehind模式。在VS2005中又改进了VS2003的CodeBehind模式。在VS2003中所有在.aspx中所加入的控件都在对应的.cs文件中以成员变量的形式列出来,另外VS2003中会在对应的.cs文件中产生好多窗体自动生成的代码,对于这些自动生成的东西,对于初学者来说会感到一些恐慌,而对于熟练的程序员来说,是了解与控制页面运作的好的入口点。
        在VS2005中的CodeBehind模式中,.cs文件中不再有太多的窗体自动生成的代码,这样使.cs文件更清晰,对初学者来说相对简单了。但对于熟悉面向对象的程序员来说,这里的页面类却有点不伦不类--为什么没有成员变量的声明却能够使用成员变量呢?而且要想对页面初始化进一步控制的话仿佛还要回归到VS2003的相关事件和方法中去寻找。尽管好多资料对这种新的CodeBehind模式进行推祟,但我感觉这种模式并利于初学者对页面类的理解。
       1、partial关键字:partial类是VS2005对语法的一次重大改进,克服了过去“同一个类的成员必须写在同一个类的花括号内”的古老作法。它在类的定义的基础上,实现了写法上的“松散化”。
                partial类可以重名,在编译的时候会把同名的partial类当成一个类来看待,这样我们就可以把一些复杂的类交给不同的程序员来编写,而省去了后期的代码合成的过程。
               正是有了partial类,我的CodeBehind模式才会变得发此简单。大家试一下,把.cs文件中页面的类的partial关键字删掉,会出现什么情况?--会出错。为什么呢?因为在编译时.aspx文件和.aspx.cs两个文件会分别作为两个partial类看待,如果你把一个类的partial 关键字去掉的话当然会出现重名类了。现在你应当知道新的CodeBehind模式中的.cs文件为什么会如此简洁了吧?因为所有自动生成的内容全都封装在aspx这个partial类里了。当然这个.aspx文件的partial类可真的不太像一个传统意义上的类,但没办法,它确实作为类的身份进行运行。
        2、Page指示词的变化:在VS2003中Page指示词中有一个属性"CodeBehind=...." ,但到了VS2005却变为"CodeFile=......"

    五、数据库的注册与连接:
       1、注册数据库:
        在ASP.NET2.0中提供许多新的功能,如验证与授权、WebPart、主体特征设置等,所有这些都依托数据库来实现,因此在使用这些新功能之前应当注册一下数据库
        在VS2005的Dos窗口中,运行aspnet_regsql命令,会弹出一个向导对话框,可以根据提示信息,一步步完成数据库的注册。注册完成后,会在相应的数据库中产生11个表,这些表就是完成新功能所依托的数据表。
        或直接在VS2005的Dos窗口中运行aspnet_regsql -S .\sqlexpress -U sa -P Test -d mydb -A all
        2、连接字符串的设置:
        在VS2005中连接字符串的设置已不推荐写在<appSettings>配置节中,而是写在<connectionStrings>配置节中,而<appSettings>配置节中可以进行一些其它的配置。如下:
        <connectionStrings>
              <add name="conn" connectionString="server=.\sqlexpress;database=mydb;uid=sa;pwd=123" />
        </connectionStrings>

        3、连接字符串的读取:
         string str = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["conn"].ToString();
         Response.Write(str);

        4、加密连接字符串:
          aspnet_regiis -pe "connectionStrings" -app "/webapp0831" -prov "RSAProtectedConfigurationProvider"
         -pe      要加密的配置节元素名称
        -app    要加密的应用程序虚拟目录
        -prov   选择哪种方式进行加密
        5、解密连接字符串:
        aspnet_regiis -pd "connectionStrings" -app "/webapp0831"

    六、交叉提交:
        交叉提交的场景:在一个aspx页面中输入数据(如:用户注册),在提交到另一个页面后,把用户刚才填写的信息全部显示出来,让用户确认无误后再提交到数据库去。
        在asp可以通过form表单的action来指定一下跳转页面,然后在新页面中可以取出数据来。到了asp.net1.1后,其页面模型与asp有些不同,aspx页面与其对应的aspx.cs文件共同形成一个页面对象,用户填写的表单数据也就成为了页面对象的成员,由于HTTP协议的无状态性,用户在另一个页面取得前一个页面的数据就要花费很大的精力。
        在asp.net2.0中新增了交叉提交的功能,这对程序员来说可真是“及时雨”,下面看一下如何使用交叉提交:
        在asp.net2.0环境中,每一个按钮多了一个新的属性:PostBackUrl。PostBackUrl代表的是用户把数据提交到那个页面的URL地址。
        1.访问源页面控件的内容:
            有两个页面:SourcePage.aspx和TargetPage.aspx
           //SourcePage.aspx 页面的HTML源代码如下:(请注意按钮的PostBackUrl属性)
            <form id="form1" runat="server">
                <asp:TextBox ID="txt" runat="server" Style="position: static"></asp:TextBox>
                <asp:Button ID="Button1" runat="server" Style="position: static" Text="Button" OnClick="Button1_Click" PostBackUrl="TargetPage.aspx" />
            </form>

           //TargetPage.aspx.cs页面的C#代码如下:(注意PreviousPage.FindControl方法)
            protected void Page_Load(object sender, EventArgs e)
            {
                TextBox tb = (TextBox)PreviousPage.FindControl("txt");
                Response.Write(tb.Text);
            }   

            这样就可以在TargetPage.aspx页面取得SourcePage.aspx页面中的数据了。
        2.使用@PreviousPageType,访问源页面中页面类的属性(Property)和方法(Method):
            有两个页面:SourcePage.aspx和TargetPage.aspx
           //SourcePage.aspx页面的HTML源代码如下:(请注意按钮的PostBackUrl属性)
            <form id="form1" runat="server">
                <asp:TextBox ID="txt" runat="server" Style="position: static"></asp:TextBox>
                <asp:Button ID="Button1" runat="server" Style="position: static" Text="Button" OnClick="Button1_Click" PostBackUrl="TargetPage.aspx" />
            </form>

           //SourcePage.aspx 页面的C#源代码如下:
            public partial class SourcePage : System.Web.UI.Page
            {
                public string Name
                {
                    get
                    {
                        return "GrayWorm";
                    }
                }
               public string show()
               {
                   return "defafult12.show()";
               }
            }

           //TargetPage.aspx页面的HTML源代码中加入如下的声明行:
            <%@ PreviousPageType VirtualPath="~/Default12.aspx" %>
           //TargetPage.aspx.cs页面的C#源代码如下:
           protected void Page_Load(object sender, EventArgs e)
            {
                Response.Write(PreviousPage.Name);
                Response.Write(PreviousPage.show());
            }

        3.使用@Reference,访问源页面中的内容
            //SourcePage.aspx 页面的HTML源代码如下: (请注意按钮的PostBackUrl属性)
            <form id="form1" runat="server">
                <asp:TextBox ID="txt" runat="server" Style="position: static"></asp:TextBox>
                <asp:Button ID="Button1" runat="server" Style="position: static" Text="Button" OnClick="Button1_Click" PostBackUrl="default13.aspx" />
            </form>

           //SourcePage.aspx页面的C#源代码如下:
            public partial class SourcePage : System.Web.UI.Page
            {
                public string Name
                {
                    get
                    {
                        return "GrayWorm";
                    }
                }
                public string show()
                {
                    return "defafult12.show()";
                }
            }

           //TargetPage.aspx页面的HTML源代码中,加入下面的声明行:
           <%@ Reference VirtualPath="~/Default12.aspx" %>
           //TargetPage.aspx.cs页面的C#源代码如下:
           if (PreviousPage != null)
            {
                if (IsCrossPagePostBack)
                {
                    Default12 d = (Default12)PreviousPage;
                    string s = ((TextBox)d.FindControl("txt")).Text;
                    Response.Write(s);
                    Response.Write(d.Name);
                    Response.Write(d.show());
                }
            }

    七、客户端功能:

           1.默认提交按钮与默认焦点设置:
            <form id="form1" runat="server" defaultbutton="Button1" defaultfocus="txt">
                <asp:TextBox ID="txt" runat="server" ></asp:TextBox>
                <asp:TextBox ID="TextBox1" runat="server" ></asp:TextBox>
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                <asp:Button ID="Button2" runat="server" Text="Button" />
            </form>
            defaultbutton属性:设置当前表单的默认提交按钮,当按回车键的时候默认触发该按钮的事件
            defaultfocus属性:设置默认焦点的控件的id
          2.设置Web窗体控件的客户的click事件:
           在asp.net1.1中,web窗体控件属性中有一个OnClick事件,但这个OnClick事件调用的是aspx.cs后置类的服务器端的方法名称。而不是客户端JavaScript函数的名称。为了实现Web窗体控件能够调用到客户端的JavaScript函数,我们只好在Page_Load事件中给按钮对象的Attributes集合添加客户端代码,实在是麻烦又难以理解。
           到了asp.net2.0中我们惊喜地发现了一个新事件--OnClientClick事件。这个事件就是Web窗体控件调用的客户端代码用到的事件,用起来就像HTML控件调用客户端代码一样。
           <asp:Button ID="Button2" runat="server" Text="Button" OnClientClick="window.alert('hello world')" />
           <asp:Button ID="Button3" runat="server" Text="Button" OnClientClick="return showclientwindow()" />
           <script language=javascript>
                function showclientwindow()
                {
                    return window.confirm("Are you ready?");
                }
           </script>
            3. 动态注册客户端的JavaScript脚本:
            在不同位置注册的脚本作用有什么不同,这里不多说了。 在asp.net2.0中注册脚本用的是Page.ClientScript对象,Page.ClientScript对象是ClientScriptManager类的实例。
            动态注册的客户端脚本常用的有四类:
            a.在<Head>标记内注册脚本   (需要在按钮的属性中设置OnClientClick="show()" )
                string script = "<script language='javascript'>function show(){window.alert('hello world');}</script>";
                if (!Page.ClientScript.IsClientScriptBlockRegistered("testshow"))
                {
                    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "testshow", script);
                }

            b.在<body>末尾注册脚本    (需要在按钮的属性中设置OnClientClick="show()" )
                string script = "<script language='javascript'>function show(){window.alert('hello world');}</script>";
                if (!Page.ClientScript.IsStartupScriptRegistered("testshow"))
                {
                    Page.ClientScript.RegisterStartupScript(this.GetType(), "testshow", script);
                }

            c.在<Head>标记内注册JS链接文件 (需要在按钮的属性中设置OnClientClick="show()" )
                string script = "<script language='javascript'>function show(){window.alert('hello world');}</script>";
                 if (!Page.ClientScript.IsClientScriptIncludeRegistered("testshow"))
                {
                    Page.ClientScript.RegisterClientScriptInclude(this.GetType(), "testshow", "js.js");
                }

            d.在<body>内注册提交脚本   (无需在按钮的属性中设置OnClientClick="show()" )     
                string script = "window.alert('Are you sure to submit?')";
                if (!Page.ClientScript.IsOnSubmitStatementRegistered("testshohw"))
                {
                    Page.ClientScript.RegisterOnSubmitStatement(this.GetType(), "testshow", script);
                }

  • 相关阅读:
    c# 图片保存为流Stream,再次加载时提示System.ArgumentOutOfRangeException: 要求非负数的解决办法
    VS 2019 Git failed with a fatal error的解决办法
    IIS安全狗卸载后,IIS8.5,网站无法访问的解决方法
    sqlserver 全文检索提高精确度的一个方法
    Win10应用商店打不开的解决办法
    Dapper解析嵌套的多层实体类
    Aspose.Words转换为PDF的时候字体丢失的问题解决
    IIS ASP.NET MVC 上传文件到NAS目录
    windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭
    c# 计算中文字节数与JAVA不符的解决方法
  • 原文地址:https://www.cnblogs.com/aion111/p/1642981.html
Copyright © 2011-2022 走看看