• <abbr id="kam3m"><form id="kam3m"></form></abbr>

    <u id="kam3m"><li id="kam3m"></li></u>

  • <table id="kam3m"></table>
    
    

    <u id="kam3m"></u>
    18禁无遮挡啪啪无码网站,真人无码作爱免费视频,2018年亚洲欧美在线v,国产成人午夜一区二区三区 ,亚洲精品毛片一区二区,国产在线亚州精品内射,精品无码国产污污污免费,国内少妇人妻偷人精品

    ASP.Net中程序構(gòu)架和程序代碼分離

    前言:本站為你精心整理了ASP.Net中程序構(gòu)架和程序代碼分離范文,希望能為你的創(chuàng)作提供參考價(jià)值,我們的客服老師可以幫助你提供個(gè)性化的參考范文,歡迎咨詢。

    中程構(gòu)架程序代碼分離

    時(shí)間:2003-5-27作者:秩名

    一年前,當(dāng)本人拿到一個(gè)名叫TWIG的PHP程序時(shí),立即被作者OOP編程思想所折服,很難想像TWIG中所有的功能(行事歷、郵件、個(gè)性化)均在一個(gè)PHP文件(index.php3)中執(zhí)行完成,這就得益于作者采用了程序代碼與頁(yè)面構(gòu)架分離的思想,但是我也看到盡管作者做了很大的努力,但由于PHP的局限性,程序并沒(méi)有真正做到代碼與構(gòu)架的分離,index.php3這個(gè)主文件由于要執(zhí)行的功能太多,所以其require的模塊文件相當(dāng)之多,至使整個(gè)文件依然顯得十分零亂,本人愚昧,當(dāng)時(shí)花了半個(gè)月的時(shí)間,才真正明白程序的構(gòu)架,分析代碼之苦,無(wú)人能知啊(黯然淚下......)。

    TWIG程序?qū)ξ掖撕蟮木幊逃兄艽蟮挠绊懀羌词惯@樣的作品,依然沒(méi)有擺脫程序代碼與HTML代碼混雜的局面。

    程序代碼與頁(yè)面構(gòu)架的分離是WEB程序員多年的夢(mèng)想。在出現(xiàn)之前,無(wú)論是ASP、PHP還是JSP,程序代碼與HTML代碼都是混雜在一起的,這種做法,雖然在WEB技術(shù)初期受到贊揚(yáng),但是隨著時(shí)間的的推移,它的弊端是越來(lái)越明顯,當(dāng)程序代碼很長(zhǎng)時(shí),HTML代碼與其混雜,程序的可讀性變得很差,讓人無(wú)法分清程序真正要表示的頁(yè)面構(gòu)架。

    而新技術(shù)則通過(guò)Codebehind、用戶控件(UserControl)以及自定義控件(CustomControl)等方法真正做到了代碼的分離。這是一個(gè)了不起的進(jìn)步,大家可以在本文中看到分離代碼后的程序的結(jié)構(gòu)是多么的清晰。

    為了便于理解,這里設(shè)計(jì)的頁(yè)面比較簡(jiǎn)單,頁(yè)面分為三個(gè)主要的部分,頭部包含一個(gè)AdRotator控件(用于顯示廣告)與一個(gè)Label控件(用于顯示當(dāng)前廣告鏈接地址);中部是一個(gè)登陸頁(yè)面,包括兩個(gè)TextBox控件(分別用于輸入用戶名與密碼)、一個(gè)Label控件(顯示登陸是否成功)與一個(gè)Button控件(作為提交按鈕);底部包含兩個(gè)Label控件(分別顯示當(dāng)前用戶名與用戶權(quán)限)。

    熟悉的朋友,馬上就會(huì)意識(shí)到頭部由于使用了AdRotator控件,所以必定存在OnAdCreated事件以便在Label控件顯示相應(yīng)鏈接;而中部由于使用Button控件做為提交按鈕,所以必定有一個(gè)OnClick事件處理。

    1CodeBehind

    首先我們就看看如何使用CodeBehind方法來(lái)實(shí)現(xiàn)代碼與頁(yè)面構(gòu)架的分離,下面給出的源程序是主程序--Example1.aspx:

    <%@PageSrc="cs\EventHandle.cs"Inherits="Aspcn"%>

    <html>

    <head>

    <title></title>

    </head>

    <body>

    <formrunat="server">

    <asp:Panelid="Header"runat="server">

    <asp:AdRotatorid="ad"AdvertisementFile="AdBanners\ad.xml"BorderWidth="0"OnAdCreated="AdCreated"runat="server"/><br>

    當(dāng)前廣告鏈接:<asp:Labelid="lblAdText"ForeColor="red"runat="server"/>

    </asp:Panel>

    <asp:Panelid="Logon"runat="server">

    <table>

    <tr><tdcolspan="2"align="center"><b>登陸窗口</b></td></tr>

    <tr><tdcolspan="2"align="center"><asp:Labelid="lblMsgShow"ForeColor="red"runat="server"/></td></tr>

    <tr><td>用戶名:</td><td><asp:TextBoxid="tbUserName"runat="server"/></td></tr>

    <tr><td>密碼:</td><td><asp:TextBoxid="tbPasswd"TextMode="Password"runat="server"/></td></tr>

    <tr><td><asp:Buttonid="btnSubmit"Text="登陸"OnClick="Submit_Click"runat="server"/></td></tr>

    </table>

    </asp:Panel>

    <asp:Panelid="Footer"runat="server">

    用戶名:<asp:Labelid="lblUserName"Font-Name="Arial"ForeColor="red"Text="游客"runat="server"/>

    權(quán)限:<asp:Labelid="lblPurview"Font-Name="Arial"Text="無(wú)"ForeColor="red"runat="server"/>

    </asp:Panel>

    </form>

    </body>

    </html>

    例程中,大家可以清楚地看到程序中不包含任何C#、VB、javascript來(lái)處理OnAdCreated與OnClick事件,但是執(zhí)行本程序,程序能夠正常使用(如圖2-1與圖2-2)。這便是使用CodeBehinde的結(jié)果,事件處理已經(jīng)被轉(zhuǎn)移到其它程序中定義執(zhí)行。請(qǐng)大家注意本例中第一行的信息:

    <%@PageSrc="cs\EventHandle.cs"Inherits="Aspcn"%>

    一般在程序中,Page指令都在設(shè)定本程序應(yīng)當(dāng)使用什么語(yǔ)言(使用Language屬性),而本例中沒(méi)有出現(xiàn)Language屬性,而是出現(xiàn)了兩個(gè)新的Page屬性:Src與Inherits。Src屬性設(shè)定事件處理真正的代碼位置,Inherits屬性則設(shè)定需要引入的類名。可以看到本例中定義事件處理的文件是EventHandle.cs,我們來(lái)看看它的具體內(nèi)容:usingSystem;

    usingSystem.Data;

    usingSystem.Data.SqlClient;

    usingSystem.Web;

    usingSystem.Web.UI;

    usingSystem.Web.UI.WebControls;

    usingSystem.Web.UI.HtmlControls;

    publicclassAspcn:Page

    {

    //聲明WebForm中出現(xiàn)的控件

    publicLabellblAdText,lblUserName,lblPurview,lblMsgShow;

    publicTextBoxtbUserName,tbPasswd;

    publicButtonbtnSubmit;

    publicAdRotatorad;

    privatestringstrConnString="server=(local)\\Feidao;database=aspcn;Trusted_Connection=yes";

    //處理Adrotator控件建立事件

    publicvoidAdCreated(Objectsrc,AdCreatedEventArgse)

    {

    lblAdText.Text=e.AlternateText;

    }

    publicvoidSubmit_Click(Objectsender,EventArgse)

    {

    SqlConnectionMyConn=newSqlConnection(strConnString);

    MyConn.Open();

    stringstrUserName,strPassword,strSelect;

    strUserName=tbUserName.Text;

    strPassword=tbPasswd.Text;

    strSelect="select*frombbs_userwhereid=''''"+strUserName+"''''andpassword=''''"+strPassword+"''''";

    SqlCommandMyComm=newSqlCommand(strSelect,MyConn);

    SqlDataReaderdr=MyComm.ExecuteReader();

    if(dr.Read())

    {

    //登陸成功

    lblMsgShow.Text="登陸成功";

    lblUserName.Text=dr["id"].ToString();

    lblPurview.Text=dr["purview"].ToString();

    }

    else

    {

    //登陸不成功

    lblMsgShow.Text="登陸不成功";

    }

    dr.Close();

    MyConn.Close();

    }

    }

    進(jìn)行事件處理是定義在一個(gè)類中的(本例中是Aspcn,注意大小寫),由于需要與WebForms相關(guān)聯(lián),所以此類還必須繼承Page類。

    分析程序,大家可以看到程序中對(duì)事件的處理操作是與普通的未進(jìn)行代碼分離的程序是一樣的,并沒(méi)有什么特別的地方。(本人在程序中已經(jīng)給出的相關(guān)注釋,相信對(duì)大家理解程序有所幫助)

    使用CodeBehind技術(shù)后,大家需要多寫一些代碼,比如聲明控件等,也許大家很不喜歡多寫這樣的代碼,但是大家也必須看到使用了CodeBehind技術(shù)后,主程序的可讀性大大增加了。在Example1.aspx中相信大家很快就可以區(qū)分頁(yè)面構(gòu)架的各個(gè)部分,大家想想這些構(gòu)架如果在其它技術(shù)是否能看得如此清楚?

    (這里的程序只做演示用,呵呵,大家可不要抓我什么引號(hào)漏洞這些小辮子喲)

    2用戶控件(UserControl)

    CodeBehind技術(shù)真正實(shí)現(xiàn)了代碼與構(gòu)架的分離,比以前的技術(shù)前進(jìn)了一大步,但是它的缺陷也是顯而易見(jiàn)的,比如主頁(yè)面中部那個(gè)登陸區(qū),如果內(nèi)容很多,HTML顯示代碼的依然會(huì)占用很大的區(qū)域,程序的可讀性依然會(huì)降低。

    也提供了解決辦法,這就是用戶控件。

    用戶控件我們可以將其視為不用編譯的Server控件。即然是控件,那么就肯定會(huì)遵從控件的使用方法。我們將Example1.aspx中的每個(gè)Panel整體看成為一個(gè)控件,因此Example1.aspx的主體部分通過(guò)使用用戶控件便可以減少為只有三行:

    <%@RegisterTagPrefix="aspcn"TagName="Header"Src="UserControls/Header.ascx"%>

    <%@RegisterTagPrefix="aspcn"TagName="Logon"Src="UserControls/Logon.ascx"%>

    <%@RegisterTagPrefix="aspcn"TagName="Footer"Src="UserControls/Footer.ascx"%>

    <html>

    <head>

    <title></title>

    </head>

    <body>

    <formrunat="server">

    <aspcn:Headerid="MyHeader"runat="server"/>

    <aspcn:Logonid="MyLogon"runat="server"/>

    <aspcn:Footerid="MyFooter"runat="server"/>

    </form>

    </body>

    </html>

    執(zhí)行這個(gè)程序,其運(yùn)行結(jié)果與使用CodeBehind技術(shù)的結(jié)果是一樣的,但是現(xiàn)在的程序更加容易區(qū)分頁(yè)面構(gòu)架了。

    <aspcn:Headerid="MyHeader"runat="server"/>

    <aspcn:Logonid="MyLogon"runat="server"/>

    <aspcn:Footerid="MyFooter"runat="server"/>

    這三行代碼,使用了三個(gè)用戶控件,這么少的代碼大家一眼就可以清楚的看到頁(yè)面被分為三個(gè)部分。

    要使用用戶控件就必須使用Register指令,TagPrefix屬性定義是的一個(gè)Namespace的名字,以保證它在這個(gè)頁(yè)面的唯一性;TagName屬性是在定義一個(gè)類(class)的別名,由于用戶控件執(zhí)行時(shí)是被CLR編譯成為類來(lái)執(zhí)行的,所以就必須給本程序中每個(gè)用戶控件一個(gè)唯一的名字,以便于大家區(qū)分;Src屬性則是具體指出了使用的用戶控件的文件名(用戶控件均以.ascx結(jié)尾)。

    用戶控件的使用與普通Server控件一樣:

    <namespace:class...runat="server"/>

    namespace表示定義的命名空間,class則是相應(yīng)的類名,具體的使用例子有:

    <aspcn:Logonid="MyLogon"runat="server"/>

    下面是用戶控件顯示程序中所使用的用戶控件的具體內(nèi)容:

    Header.ascx(Header用戶控件)

    <ScriptLanguage="C#"Runat="Server">

    privatevoidAdCreated(Objectsrc,AdCreatedEventArgse)

    {

    lblAdText.Text=e.AlternateText;

    }

    </script>

    <asp:AdRotatorid="ad"AdvertisementFile="..\AdBanners\ad.xml"BorderWidth="0"OnAdCreated="AdCreated"runat="server"/><br>

    當(dāng)前廣告鏈接:<asp:Labelid="lblAdText"ForeColor="red"runat="server"/>

    Logon.ascx(Logon用戶控件)

    <%@ImportNamespace="System.Data"%>

    <%@ImportNamespace="System.Data.SqlClient"%>

    <ScriptLanguage="C#"Runat="Server">

    protectedstringstrConnString="server=(local)\\Feidao;database=aspcn;Trusted_Connection=yes";

    //定義UserControl的屬性

    publicstringUserName

    {

    get

    {

    returntbUserName.Text;

    }

    set

    {

    tbUserName.Text=value;

    }

    }

    publicstringPassword

    {

    get

    {

    returntbPasswd.Text;

    }

    set

    {

    tbPasswd.Text=value;

    }

    }

    //事件處理

    privatevoidSubmit_Click(Objectsender,EventArgse)

    {

    SqlConnectionMyConn=newSqlConnection(strConnString);

    MyConn.Open();

    stringstrUserName,strPassword,strSelect;

    strUserName=tbUserName.Text;

    strPassword=tbPasswd.Text;

    strSelect="select*frombbs_userwhereid=''''"+strUserName+"''''andpassword=''''"+strPassword+"''''";

    SqlCommandMyComm=newSqlCommand(strSelect,MyConn);

    SqlDataReaderdr=MyComm.ExecuteReader();

    if(dr.Read())

    {

    //登陸成功

    lblMsgShow.Text="登陸成功";

    Session["UserName"]=dr["id"].ToString();

    Session["Purview"]=dr["purview"].ToString();

    }

    else

    {

    //登陸不成功

    lblMsgShow.Text="登陸不成功";

    }

    dr.Close();

    MyConn.Close();

    }

    </script>

    <table>

    <tr><tdcolspan="2"align="center"><b>登陸窗口</b></td></tr>

    <tr><tdcolspan="2"align="center"><asp:Labelid="lblMsgShow"ForeColor="red"runat="server"/></td></tr>

    <tr><td>用戶名:</td><td><asp:TextBoxid="tbUserName"runat="server"/></td></tr>

    <tr><td>密碼:</td><td><asp:TextBoxid="tbPasswd"TextMode="Password"runat="server"/></td></tr>

    <tr><td><asp:Buttonid="btnSubmit"Text="登陸"OnClick="Submit_Click"runat="server"/></td></tr>

    </table>

    Footer.ascx(Footer用戶控件)

    <ScriptLanguage="C#"Runat="Server">

    privatevoidPage_Load(Objectsrc,EventArgse)

    {

    if(Session["UserName"]!=null)

    {

    lblUserName.Text=(string)Session["UserName"];

    lblPurview.Text=(string)Session["Purview"];

    }

    }

    </script>

    用戶名:<asp:Labelid="lblUserName"Font-Name="Arial"ForeColor="red"Text="游客"runat="server"/>

    權(quán)限:<asp:Labelid="lblPurview"Font-Name="Arial"Text="無(wú)"ForeColor="red"runat="server"/>

    每個(gè)控件包含有自已的顯示代碼以及相應(yīng)的程序代碼。

    我們可以將一些常用的功能制作成為固定的用戶控件,當(dāng)需要時(shí),我們就可直接拿來(lái)使用,而不需要使用煩人的Crtl+C,Ctrl+V來(lái)"復(fù)制"、"粘貼"長(zhǎng)長(zhǎng)的一大堆代碼。

    用戶控件不僅做到了程序代碼與頁(yè)面構(gòu)架的分離,而且還增加了代碼重用性。

    3自定義控件(CustomControl)

    用戶控件是很不錯(cuò)的選擇,但是由于每個(gè)用戶控件都是一個(gè)ascx文件,當(dāng)這些控件很多時(shí),它們的使用就顯得比較零亂。此時(shí)我們便想可不可以將一些比較相似的控件整合起來(lái),在程序中只需要引用一次,便全部搞定。這是個(gè)很不錯(cuò)的想法,我們把這個(gè)想法說(shuō)得更加專業(yè)一些:"將多個(gè)類(class)導(dǎo)入同一個(gè)命名空間(namespace)"。呵呵,怎么樣,這句話是不是有點(diǎn)有耳熟?大家快去查一查Server控件的定義,是不是發(fā)現(xiàn)這句話是...

    我們下面就要接觸如何寫Server控件。編寫Server控件并不是一件輕松容易的事情,需要對(duì).Net平臺(tái)有比較深的了解,適合于高級(jí)用戶,因此這里本人也不會(huì)具體描述Server控件的編寫步驟(要細(xì)細(xì)講這個(gè),非得寫書(shū)不可)。請(qǐng)大家比較一下自定義控件源代碼與用戶控件的區(qū)別,作一些大致的了解:

    usingSystem;

    usingSystem.Data;

    usingSystem.Data.SqlClient;

    usingSystem.Drawing;

    usingSystem.Web;

    usingSystem.Web.UI;

    usingSystem.Web.UI.WebControls;

    namespaceaspcn

    {

    //首先是Header

    publicclassHeader:Control,INamingContainer

    {

    privateAdRotatorad;

    privateLabellblAdText;

    protectedoverridevoidCreateChildControls()

    {

    //加入AdRotator廣告控件

    ad=newAdRotator();

    ad.AdvertisementFile="AdBanners/ad.xml";

    ad.BorderWidth=0;

    ad.AdCreated+=newAdCreatedEventHandler(this.OnAdCreated);

    this.Controls.Add(ad);

    this.Controls.Add(newLiteralControl("<br>"+"當(dāng)前廣告鏈接為:"));

    //加入Label控件

    lblAdText=newLabel();

    lblAdText.ForeColor=Color.Red;

    this.Controls.Add(lblAdText);

    }

    privatevoidOnAdCreated(Objectsender,AdCreatedEventArgse)

    {

    this.lblAdText.Text=e.AlternateText;

    }

    }

    //接著是Logon

    publicclassLogon:Control,INamingContainer

    {

    privatestringstrConnString="server=(local)\\Feidao;database=aspcn;Trusted_Connection=yes";

    privateLabellblMsgShow;

    privateTextBoxtbUserName,tbPasswd;

    publicStringUserName

    {

    get

    {

    returntbUserName.Text;

    }

    set

    {

    tbUserName.Text=value;

    }

    }

    protectedoverridevoidCreateChildControls()

    {

    //添加HTML標(biāo)簽

    this.Controls.Add(newLiteralControl("<table><tr><tdcolspan=\"2\"align=\"center\"><b>登陸窗口</b></td></tr><tr><tdcolspan=\"2\"align=\"center\">"));

    //添加MsgShowLabel控件公務(wù)員之家版權(quán)所有

    lblMsgShow=newLabel();

    lblMsgShow.ForeColor=Color.Red;

    this.Controls.Add(lblMsgShow);

    this.Controls.Add(newLiteralControl("</td></tr><tr><td>用戶名:</td><td>"));

    //添加UserName與PasswdTextBox控件

    tbUserName=newTextBox();

    this.Controls.Add(tbUserName);

    this.Controls.Add(newLiteralControl("</td></tr><tr><td>密碼:</td><td>"));

    tbPasswd=newTextBox();

    tbPasswd.TextMode=TextBoxMode.Password;

    this.Controls.Add(tbPasswd);

    this.Controls.Add(newLiteralControl("</td></tr><tr><td>"));

    //添加BtnSubmitButton控件

    ButtonbtnSubmit=newButton();

    btnSubmit.Text="登陸";

    btnSubmit.Click+=newEventHandler(this.Submit_Click);

    this.Controls.Add(btnSubmit);

    this.Controls.Add(newLiteralControl("</td></tr></table>"));

    }

    //顯示完畢

    privatevoidSubmit_Click(Objectsender,EventArgse)

    {

    SqlConnectionMyConn=newSqlConnection(strConnString);

    MyConn.Open();

    stringstrUserName,strPassword,strSelect;

    strUserName=tbUserName.Text;

    strPassword=tbPasswd.Text;

    strSelect="select*frombbs_userwhereid=''''"+strUserName+"''''andpassword=''''"+strPassword+"''''";

    SqlCommandMyComm=newSqlCommand(strSelect,MyConn);

    SqlDataReaderdr=MyComm.ExecuteReader();

    if(dr.Read())

    {

    //登陸成功

    this.lblMsgShow.Text="登陸成功";

    }

    else

    {

    //登陸不成功

    this.lblMsgShow.Text="登陸不成功";

    }

    dr.Close();

    MyConn.Close();

    }

    }

    //最后是Footer

    publicclassFooter:Control,INamingContainer

    {

    privatestring_UserName,_Purview;

    publicstringUserName

    {

    get

    {

    return_UserName;

    }

    set

    {

    _UserName=value;

    }

    }

    publicstringPurview

    {

    get

    {

    return_Purview;

    }

    set

    {

    _Purview=value;

    }

    }

    publicFooter()

    {

    _UserName="游客";

    _Purview="無(wú)";

    }

    protectedoverridevoidCreateChildControls()

    {

    this.Controls.Add(newLiteralControl("用戶名:"));

    LabellblUserName=newLabel();

    lblUserName.ForeColor=Color.Red;

    lblUserName.Font.Name="Arial";

    lblUserName.Text=this.UserName;

    this.Controls.Add(lblUserName);

    //this.Controls.Add(newLiteralControl("nbsp;"));

    this.Controls.Add(newLiteralControl("權(quán)限:"));

    LabellblPurview=newLabel();

    lblPurview.ForeColor=Color.Red;

    lblPurview.Font.Name="Arial";

    lblPurview.Text=this.Purview;

    this.Controls.Add(lblPurview);

    }

    }

    }

    上面和程序是將需要實(shí)現(xiàn)的功能,全部導(dǎo)入了自定義控件。程序中可以看到,在aspcn命名空間中包含三個(gè)類(Header,Logon,Footer),這三個(gè)類正是構(gòu)架三個(gè)主體部分。

    要使用自定義控件,還必須將原代碼進(jìn)行編譯。

    csc/t:library/out:aspcn.dll/r:System.Data.dll,System.Web.dll,System.Drawing.dllCustomControls.cs

    C#程序編譯指令的用法,本人在此也不再重復(fù)。需要注意的是編譯的文件名,必須與控件中namespace的名字一致。

    編譯后的dll,仍然不能使用,我們必須將其放到.Net平臺(tái)中最著名的目錄--/bin中,bin目錄(如果不存在,可以自行建立)存放的是當(dāng)前虛擬目錄中所有使用自定義控件以及組件,CLR在執(zhí)行程序時(shí)會(huì)自動(dòng)搜索此目錄中的文件,以找到與程序相匹配的Namespace、Class以及Assembly。

    當(dāng)我們將程序編譯好的aspcn.dll放入/bin目錄后,這個(gè)自己編寫的Server控件便可以使用了。

    (需要聲明一下,由于編寫Server控件時(shí)不能使用Session等變量,以至無(wú)法做到兩個(gè)class之間的通信,因此在缺省狀態(tài)下Footer控件并不能像前面的程序一樣隨Session內(nèi)容發(fā)生改變,不過(guò)可以通過(guò)普通操作Server控件的方法來(lái)操作相應(yīng)的屬性達(dá)到相同的效果,此處為節(jié)約版面,未采用)

    下面再來(lái)看看主體WebForm的程序內(nèi)容:

    <%@RegisterTagPrefix="aspcn"Namespace="aspcn"Assembly="aspcn"%>

    <html>

    <head>

    <title></title>

    </head>

    <body>

    <formrunat="server">

    <aspcn:Headerid="MyHeader"runat="server"/>

    <aspcn:Logonid="MyLogon"runat="server"/>

    <aspcn:Footerid="MyFooter"runat="server"/>

    </form>

    </body>

    </html>

    怎么樣,相當(dāng)簡(jiǎn)單明了吧。

    引用我們自定義的控件,也相當(dāng)簡(jiǎn)潔,只需將Register指令的TagPrefix、Namespace、Assembly屬性全部設(shè)定為aspcn。

    至此,中三種代碼與頁(yè)面構(gòu)架分離的方法已經(jīng)介紹完畢。

    三種方法各有優(yōu)劣,本人比較傾向于使用用戶控件與CodeBinde技術(shù)結(jié)合使用,因?yàn)樗麄兙恍枰幾g,相對(duì)來(lái)說(shuō)更容易使用,如果您要保護(hù)你的代碼,自定義控件則當(dāng)然是您最佳的選擇。

    文檔上傳者
    主站蜘蛛池模板: 色综合久久中文综合久久激情| 99视频精品国产免费观看| 午夜福利日本一区二区无码| 午夜短视频日韩免费| 把女人弄爽大黄A大片片| 亚洲区精品区日韩区综合区| 国产69精品久久久久久妇女迅雷| 亚洲av永久无码精品天堂久久| 精品天堂色吊丝一区二区| 人妻精品中文字幕av| 国产按头口爆吞精在线视频| 少妇内射高潮福利炮| 久久久精品94久久精品| 免费国精产品自偷自偷免费看 | 狠狠色婷婷久久综合频道日韩| 久久久美女| 亚洲AV综合A∨一区二区| 人妻熟妇乱又伦精品无码专区| 国产99精品成人午夜在线| 亚洲AV成人片不卡无码| 国产人妻无码一区二区三区18| 国产成人女人在线观看| 亚洲av成人区国产精品| 香蕉乱码成人久久天堂爱| 四虎影视4hu4虎成人| 精品无码国产污污污免费| 真实国产熟睡乱子伦视频| 欧美性群另类交| 午夜成人亚洲理伦片在线观看| 欧美一区二区三区在线可观看| 少妇人妻偷人精品免费| 久久精品道一区二区三区| 亚洲 制服 丝袜 无码| 他掀开裙子把舌头伸进去添视频| 亚洲人成网址| 亚洲国产精品热久久| 国产精品va在线观看h| 国产超高清麻豆精品传媒麻豆精品 | 日本高清一区二区在线观看| 国产av一区二区三区天堂综合网| 亚洲中文一区二区av|