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);
            }

你可能感兴趣的:(asp.net)