官术网_书友最值得收藏!

第3章 ASP.NET語法

如果讀者熟悉ASP,就會發(fā)現(xiàn)ASP.NET的很多語法是非常類似于ASP的。但ASP.NET引入了許多新特性,例如編譯型的編程語言、服務(wù)器端的事件處理、Web控件等,因此相應(yīng)的ASP.NET也引入了一些新的語法。

本章主要內(nèi)容如下:

● 兩種編寫服務(wù)器端代碼的方法

● 引入外部代碼

● 在服務(wù)器端、客戶端及代碼內(nèi)部使用注釋

● HTML服務(wù)器控件

● Web服務(wù)器控件

● 服務(wù)器端包含指令

● 服務(wù)器端對象標志語法

● 數(shù)據(jù)綁定語法

3.1 服務(wù)器端代碼

在介紹單文件版本的Web窗體窗體時,提到過兩種編寫服務(wù)器端代碼的方法:<Script runat=server>…</Script>和<%… %>。第一種方法撰寫服務(wù)器端代碼構(gòu)成一個代碼聲明塊。第二種方法撰寫的服務(wù)器端代碼構(gòu)成一個呈現(xiàn)代碼塊。

代碼聲明塊定義將編譯為生成的Page派生類的成員變量和方法。而呈現(xiàn)代碼塊則不同,它們在編譯后不會成為派生類的任何成員,而是成為Web窗體派生類的呈現(xiàn)邏輯的一部分。

提示

Web窗體在其生命周期中有幾個典型的階段。呈現(xiàn)階段是Web窗體生命周期的最后一個階段,在這一階段,Web窗體被ASP.NET框架翻譯成對應(yīng)的HTML代碼,翻譯時,要執(zhí)行呈現(xiàn)代碼塊。

請讀者一定要注意,所有的函數(shù)和全局頁變量都必須在 <Script runat=server> 標志中聲明,在<% %> 塊內(nèi)聲明的函數(shù)將生成語法編譯錯誤。

呈現(xiàn)代碼允許使用<%= ...%>直接把表達式的結(jié)果輸出,這跟ASP語法類似。例如,實現(xiàn)輸出“Hello World”這種形式的代碼為:

    [Visual Basic]
    <%="Hello World" %>
    [C#]
    <%="Hello World" %>

上面的代碼等價于下面的呈現(xiàn)代碼:

    [Visual Basic]
    <% Response.Write("Hello World") %>
    [C#]
    <% Response.Write("Hello World"); %>

注意

上述C#中代碼后的“;”不可少,單如果采取<%=…%>形式,則“;”不需要,如果寫成:

              [C#]
              <%="Hello World" ;%>
              那么將等價于:
              [C#]
              <% Response.Write("Hello World";); %>
              這時將發(fā)生編譯錯誤。

下面的示例演示如何編寫服務(wù)器端代碼:

    [Visual Basic]
        <Script language="vb"runat=server>
        function  add(num1 as integer,num2 as integer)as integer
  return num1 + num2
        end function
        function  subtract(num1 as integer,num2 as integer)as integer
  return num1 - num2
        end function
        </Script>
        <html>
  <title>演示ASP.NET語法</title>
  <body>
  1+2=<%=add(1,2)%>
  <%
  '...
  dim  number as integer=subtract(2,1)
  Response.Write("<p>2-1=" + number.ToString())
  '...
        %>
  </body>
        </html>
    [C#]
    <Script language="C#" runat=server>
    int add(int num1, int num2) {
      return num1 + num2;
    }
    int subtract(int num1, int num2) {
      return num1 - num2;
    }
    </Script>
    <html>
       <title>演示ASP.NET語法</title>
      <body>
      1+2=<%=add(1,2)%>
      <%
      //...
      int number = subtract(2, 1);
       Response.Write("<p>2-1="+number.ToString());
      //...
    %>
       </body>
    </html>

請讀者一定要把服務(wù)器端代碼和客戶端代碼區(qū)分開來。客戶端代碼由客戶端的瀏覽器解釋執(zhí)行,因而撰寫客戶端代碼的腳本語言可以是JScript或VBScript,但不能是.NET框架支持的編程語言,如C#、Visual Basic等。事實上,客戶端可以對.NET一無所知。

客戶端的代碼的語法不是ASP.NET所規(guī)定,它們由HTML 3.2或更高的標準規(guī)定。為了編寫客戶端代碼,請編寫一個<Script></Script>塊,但不設(shè)定runat=server屬性,例如:

    <html>
        <head>
            <title>WebForm1</title>
        </head>
        <body bgcolor="#3366cc">
          <form id=form1>
            <input id=name type=text>
            <input id=ok  value=OK type=button onclick="OnOkClick();">
            <div id=msg >
            </div>
          </form>
        </body>
        <Script language=jScript>
          function OnOkClick()
          {
            alert(form1.name.value);
          }
        </Script>
    </HTML>

在瀏覽器中打開該網(wǎng)頁,往文本框中輸入一些文本,然后單擊【OK】按鈕,將彈出一個對話框顯示文本框的數(shù)值,如圖3-1所示。

圖3-1 客戶端代碼執(zhí)行效果

讀者要注意,通過HTML對象模型訪問HTML頁中的任何對象(實際上是一個HTML標志)的方法。一個HTML中的所有HTML標志被分拆成一棵樹狀結(jié)構(gòu)。例如,上面的代碼具有如圖3-2所示的樹狀結(jié)構(gòu)。

圖3-2 HTML代碼的樹狀結(jié)構(gòu)

圖3-2中沒有用“<>”圍起來的就是代碼樹中的一個節(jié)點,這些節(jié)點的頂層對象是document對象,通過document.form1可以訪問表單對象,通過document.form1.name可以訪問文本輸入框。所有對象名都是由其ID屬性規(guī)定的,每個對象具有若干可以通過編程訪問的屬性。例如,文本輸入框有value屬性,利用該屬性可以讀取或設(shè)置文本輸入框中的文本。作為頂級對象的document對象可以省略不寫,這樣訪問name文本輸入框的代碼可以簡化為form1.name。

提示

alert方法實際是另一個Window對象的方法,Window表示瀏覽器的當前窗口。如果HTML頁面包含多個幀(Frame),那么Window對象比較有用,這時每個幀都可以包含一個document對象,可以從Window對象出發(fā)獲得特定的幀,然后進一步獲得該幀包含的document對象,例如:

                      window.frames(0).document

上面的代碼獲得第一個幀的document對象。

上面的討論也提醒讀者,編寫客戶端代碼的所使用的模型是所謂的HTML對象樹模型,讀者需要了解諸如Window、document等對象。

在客戶端撰寫腳本而不是在服務(wù)器端編碼,能夠減少服務(wù)器負擔,降低網(wǎng)絡(luò)流量,但請讀者注意,客戶端的腳本不具任何安全性。通過查看HTML文件的源代碼,就可以把其中的客戶端腳本看得一清二楚。

3.2 注釋

準確的注釋對幫助別人理解代碼至關(guān)重要,為代碼添加必要的注釋是一個值得提倡的編程做法。

在ASP.NET編程實踐中,讀者要碰到兩種注釋:一種是HTML內(nèi)的注釋;另一種是代碼內(nèi)的注釋。

HTML內(nèi)的注釋包括兩小類:客戶端和服務(wù)器端。客戶端的HTML注釋看起來如下所示:

        <!--
            HTML客戶端注釋
        -->

注釋和注釋標志也可以位于同一行:

        <!--HTML客戶端注釋 -->

注意

“<!--”和“--->”要緊挨在一起,之間不能有空格,但注釋內(nèi)容和“--”之間則允許有空格。

服務(wù)器端的HTML注釋看起來如下所示:

          <%--
            服務(wù)器端的注釋
          --%>

或:

          <%--  服務(wù)器端的注釋   --%>

注意

“<%--”和“--%>”要緊挨在一起,之間不能有空格,但注釋內(nèi)容和“--”之間則允許有空格。

代碼內(nèi)的注釋,則跟所使用的語言有關(guān):

如果為JScript或C#,則一行中符號“//”后的內(nèi)容為注釋。另外,符號“/*”和符號“*/”之間的內(nèi)容也是注釋。

如果為VBScript或Visual Basic,則一行中符號“'”后的內(nèi)容為注釋。

3.3 引入外部代碼

在ASP編程時代,有經(jīng)驗的開發(fā)人員會把相關(guān)的功能在一個文件中實現(xiàn),然后通過include指令引入到頁面。ASP.NET保留了這種引入外部代碼的能力,其實現(xiàn)的原理是設(shè)定Script腳本的src屬性。

提示

當對Script腳本使用了src屬性后,將忽略聲明塊中的任何其他代碼。

下面的示例說明了如何為EnterBtn_Click事件定義事件處理邏輯。

    [Visual Basic]
    <% @page language="vb" %>
    <html>
      <Script  runat="server"src="file.vb"/>
      <body>
      <form runat="server">
        輸入你的名字: <asp:textbox id="Name" runat=server/>
                      <asp:button text="顯示" Onclick="EnterBtn_Click" runat="server"/>
            <p>
            <asp:label id="Message" runat=server/>
        </form>
      </body>
    </html>
其中file.vb的內(nèi)容如下:
          sub EnterBtn_Click(Src as Object,  E as EventArgs)
               Message.Text="你好,"+Name.Text+", 歡迎進入ASP.NET!"
          end sub
    [C#]
    <% @page language="cs" %>
    <html>
      <Script  runat="server"src="file.cs"/>
      <body>
      <form runat="server">
        輸入你的名字: <asp:textbox id="Name" runat=server/>
                      <asp:button text="顯示" Onclick="EnterBtn_Click" runat="server"/>
            <p>
            <asp:label id="Message" runat=server/>
        </form>
      </body>
    </html>
    其中file.cs的內(nèi)容如下:
          void EnterBtn_Click(Object Src, EventArgs E) {
               Message.Text="你好,"+Name.Text+", 歡迎進入ASP.NET!";
          }

執(zhí)行結(jié)果如圖3-3所示。

圖3-3 執(zhí)行結(jié)果

提示

在file.vb或file.cs中,請不要把代碼放在<Script runat=server>和<server>之間,否則會出現(xiàn)編譯錯誤。

3.4 服務(wù)器端包括指令

該指令可以把指定文件的內(nèi)容插入到ASP.NET頁的任意位置,其基本用法如下:

    <!-- #include file= filename -->

或:

    <!-- #include virtual = filename -->

第一種格式指定插入的文件的所在的物理路徑。此路徑可以是相對的。

提示

被包含的文件可以在同一個目錄或子目錄中,但不能在具有 #include指令的頁的上級目錄中。

第二種格式用虛擬路徑表示插入的文件所在的位置。此路徑可以是相對的。

提示

盡可能的用第二種格式,因為文件的物理路徑有可能會更改。

關(guān)于該指令需要注意以下幾點:

● 被包含文件的文件名值必須括在引號 ("") 中。

● 在執(zhí)行任何動態(tài)代碼之前處理被包含的文件。

● #include標志必須括在HTML/XML注釋分隔符中以避免被解釋為文本。

下面的示例說明了如何使用服務(wù)器端包括語法來調(diào)用將在ASP.NET頁上創(chuàng)建頁眉和腳注文件。兩個文件都使用相對路徑。

    <html>
      <body>
          <!-- #Include virtual=".\include\header.inc" -->
          Here is the main body of the .aspx file.
          <!-- #Include virtual=".\include\footer.inc" -->
      </body>
    </html>

3.5 服務(wù)器控件

服務(wù)器控件是可以在服務(wù)端訪問的對象,ASP.NET框架把服務(wù)器組件成現(xiàn)為客戶端的HTML代碼。服務(wù)器控件的runat屬性都設(shè)置為server,并且可以通過其ID屬性而被引用。

服務(wù)器控件細分為兩類,一類為Web服務(wù)器控件,另一類為HTML服務(wù)器控件。兩類的區(qū)別是后者的控件直接對應(yīng)到某個HTML元素,其屬性也對應(yīng)到HTML元素的屬性;而前者對應(yīng)到HTML元素的過程不那么直接,這類控件的屬性大多也跟HTML元素屬性毫不相關(guān),ASP.NET框架根據(jù)目標瀏覽器及控件本身的屬性,產(chǎn)生一段恰當?shù)腍TML代碼返回給客戶(這個過程叫呈現(xiàn))。

這里我們討論兩類控件的一般用法,本書后面將有專門的章節(jié)深入討論這些控件的具體用途和用法。

3.5.1 HTML服務(wù)器控件

將一個HTML元素,設(shè)置runat的屬性為server后,該元素就轉(zhuǎn)化為服務(wù)器控件。例如,下面的代碼定義了一個服務(wù)器端的表單控件:

    <form id="WebForm1" method="post" runat="server">
    </form>

提示

每一個Web窗體必須包含一個服務(wù)器端的表單控件。

下面的代碼則定義了一個HTML服務(wù)端的標簽控件,其實質(zhì)是一個runat=server的<DIV></DIV>標志。

    <DIV runat=server>標簽</DIV>

提示

在Visual Studio.NET Web窗體設(shè)計器的設(shè)計視圖下,選中一個HTML控件,單擊右鍵,單擊【作為服務(wù)器端控件運行】按鈕,會自動將其runat屬性設(shè)置為true。

在服務(wù)器端,可以通過HTML元素的ID屬性引用該控件。例如:

    [Visual Basic]
    <Script language="VB" runat="server">
      Sub Page_Load(sender As Object, e As EventArgs)
        Message.InnerHtml = "歡迎使用ASP.NET"
      End Sub
    </Script>
    ...
    <span id="Message" style="font-size:24" runat="server"/>
    [C#]
    <Script language="C#" runat="server">
      void Page_Load(Object sender, EventArgs e) {
        Message.InnerHtml = "歡迎使用ASP.NET";
      }
    </Script>
    ...
    <span id="Message" style="font-size:24" runat="server"/>

3.5.2 Web服務(wù)器控件

在Web頁引入Web服務(wù)器控件時,需要指定命名空間ASP,并將其runat屬性設(shè)置為server,例如<asp:label runat="server">引入一個標簽服務(wù)器控件,該控件與System.Web.UI.WebControls命名空間中的Label類相對應(yīng),在動態(tài)編譯.aspx文件的時候,會自動引入System.Web.UI.WebControls命名空間。

通過添加ID為“Message”的標志,在運行時創(chuàng)建Label的實例:

    <asp:label id="Message" font-size=24 runat="server"/>

然后可用同一名稱訪問此控件。下面的代碼行設(shè)置此控件的Text屬性:

    [Visual Basic]
    Message.Text = "Welcome to ASP.NET"
    [C#]
    Message.Text = "Welcome to ASP.NET";

3.6 服務(wù)器端對象標志語法

對象標志使頁開發(fā)人員能夠用基于標志的聲明語法聲明和創(chuàng)建變量的實例,該實例既可以是.NET對象,又可以是COM對象。若要創(chuàng)建.NET對象,采用下面格式的語法:

    <object id="id" runat=server latebinding=true|false class=".NET Framework Class Name">

其中id為當引用后面的代碼中的對象時使用的惟一名稱,Class指定要創(chuàng)建的 .NET框架類。

提示

當ASP.NET頁分析器在.aspx文件中遇到服務(wù)器端對象標志時,它使用該標志的ID屬性作為屬性名在該頁上生成只讀屬性,當用戶請求一個屬性時,將獲得一個Class指定的對象實例。

下面的示例說明了如何在Web窗體頁中創(chuàng)建ArrayList.NET框架類的實例。

    [Visual Basic]
    <html>
      <object id="items" class="System.Collections.ArrayList" runat=server/>
      <Script language="VB" runat=server>
          Sub Page_Load(Sender As Object, E As EventArgs)
            items.Add("One")
            items.Add("Two")
            items.Add("Three")
            MyList.DataSource = items
            MyList.DataBind()
          End Sub
      </Script>
      <body>
          <asp:datalist id="MyList" runat=server>
            <ItemTemplate>
                      數(shù)值: <%#Container.DataItem %>
            </ItemTemplate>
          </asp:datalist>
      </body>
    </html>
    [C#]
    <html>
      <object id="items" class="System.Collections.ArrayList" runat=server/>
      <Script language="C#" runat=server>
          void Page_Load(Object sender, EventArgs e) {
            items.Add("One");
            items.Add("Two");
            items.Add("Three");
            MyList.DataSource = items;
            MyList.DataBind();
          }
      </Script>
      <body>
          <asp:datalist id="MyList" runat=server>
            <ItemTemplate>
                      數(shù)值:<%# Container.DataItem %>
            </ItemTemplate>
          </asp:datalist>
      </body>
    </html>

上述代碼等價于:

    [Visual Basic]
    <html>
      <Script language="VB" runat=server>
        private items as new System.Collections.ArrayList
        ….
      </Script>
    …
    </html>
    [C#]
    <html>
      <Script language="C#" runat=server>
        private System.Collections.ArrayList items = new System.Collections.ArrayList();
        ….
      </Script>
    …
    </html>

提示

上述代碼編譯后都生成一個位于ASP命名空間從System.Web.UI.Page派生的類,而Items是該類的一個成員。

如果要創(chuàng)建COM對象實例,則相應(yīng)的語法格式是:

    <object id="id" runat=server latebinding=true|false progid="COM ProgID"/>
    或:
    <object id="id" runat=server latebinding=true|false classid="COM ClassID"/>

其中,ProgID是COM組件的編程標識符,ClassID是COM組件的類標識符。

下面是利用這種格式的指令在頁上引入ADO對象模型中的Connection對象:

    [Visual Basic]
    <%@ page language="vb" %>
    <html>
      <object id="myConn" runat=server latebinding=false progid="ADODB.CONNECTION"/>
      <Script  runat=server>
          sub outPutHtml()
            '顯示版本
            Response.Write(myConn.Version)
            '其他操作
          end sub
      </Script>
      <body>
        <%outPutHtml()%>
      </body>
    </html>
    [C#]
    <%@ page language="C#" %>
    <html>
      <object id="myConn" runat=server latebinding=false progid="ADODB.CONNECTION"/>
      <Script  runat=server>
          void outPutHtml()
          {
            //顯示版本
            Response.Write(myConn.Version);
            //其他操作
          }
      </Script>
      <body>
        <%outPutHtml()%>
      </body>
    </html>

注意

不能在同一個服務(wù)器端對象標志中同時設(shè)定classid、progid和class屬性,而只能使用其中的某一個。

開發(fā)人員還可以利用ASP.NET向開發(fā)人員公開熟悉的Server.CreateObject(ProgId) API來創(chuàng)建COM的晚期綁定引用。這時請把頁面的@Page指令的ASPCompat屬性設(shè)為true:

    <%@Page ASPCompat="true"  %>

下面利用這種方法創(chuàng)建一個ADODB.Connection對象,然后調(diào)用Open方法打開一個名為pubs的ODBC數(shù)據(jù)源(該數(shù)據(jù)源鏈接到SQLServer的pubs數(shù)據(jù)庫),接下來調(diào)用鏈接對象的Execute方法獲得一個RecordSet對象,緊接著遍歷RecordSet對象,最后關(guān)閉記錄集和鏈接。

    <%@ page language="vb" aspcompat=true %>
    <html>
      <Script  runat=server>
          sub outPutHtml()
            dim conn =Server.CreateObject("adodb.connection")
            conn.Open("pubs")
            dim rs =conn.Execute("select au_lname,au_fname from authors")
            while not rs.EOF
               Response.Write("Last Name="&rs("au_lname").Value)
               Response.Write("    First Name="&rs("au_fname").Value)
               Response.Write("<br>")
            rs.MoveNext()
            end while
            rs.Close()
            conn.Close()
          end sub
      </Script>
      <body>
        <%outPutHtml()%>
      </body>
    </html>

執(zhí)行結(jié)果如圖3-4所示。

圖3-4 執(zhí)行結(jié)果

提示

在.NET框架下使用COM對象的一般方法是利用.NET的互操作服務(wù)把COM對象包裝成.NET組件,然后通過包裝的.NET組件間接地訪問COM對象。

3.7 數(shù)據(jù)綁定語法

ASP.NET支持分層數(shù)據(jù)綁定模型,該模型支持服務(wù)器控件屬性和父數(shù)據(jù)源之間的關(guān)聯(lián)綁定。任何服務(wù)器控件屬性都可以把數(shù)據(jù)綁定到任何公共字段或?qū)傩裕@些公共字段或?qū)傩晕挥诎摶蚍?wù)器控件的直接命名容器上。

所有數(shù)據(jù)綁定表達式都必須包含在<%#和%> 字符中,與它們的位置無關(guān)。位于<%# %> 代碼塊中的代碼只有在其父控件容器的DataBind方法被調(diào)用時才被執(zhí)行。下面的示例說明如何在<asp:datalist runat=server>控件內(nèi)使用數(shù)據(jù)綁定語法。

    <asp:datalist id="MyList" runat=server>
      <ItemTemplate>
        數(shù)值:<%# Container.DataItem %>
      </ItemTemplate>
    </asp:datalist>

上面的代碼在數(shù)據(jù)列表內(nèi)指定了一項模板(ItemTemplate)。用數(shù)據(jù)綁定表達式指定項模板的內(nèi)容,對數(shù)據(jù)源中的每一項數(shù)據(jù),都重復(fù)套用一次模板,其中的Container.DataItem引用數(shù)據(jù)列表MyList所使用的數(shù)據(jù)源的當前數(shù)據(jù)項。

本例中,以編程方式設(shè)置MyList控件的數(shù)據(jù)源,然后調(diào)用DataBind()。

    [Visual Basic]
    Sub Page_Load(sender As Object, e As EventArgs)
      Dim items As New ArrayList()
      items.Add("One")
      items.Add("Two")
      items.Add("Three")
      MyList.DataSource = items
      MyList.DataBind()
    End Sub
    [C#]
    void Page_Load(Object sender, EventArgs e) {
      ArrayList items = new ArrayList();
      items.Add("One");
      items.Add("Two");
      items.Add("Three");
      MyList.DataSource = items;
      MyList.DataBind();
    }

關(guān)于數(shù)據(jù)綁定,本書后面還要做進一步的討論。

3.8 小結(jié)

本章介紹的知識將被廣泛應(yīng)用。讀者要掌握編寫服務(wù)器端代碼的<Script runat=server>和<%%>方法,使用其他文件中的代碼能在代碼級別實現(xiàn)重用。本章介紹的服務(wù)器端包含指令和引入外部指令的語法都能做到這一點,在服務(wù)器端使用控件也是ASP.NET的新特性。本章介紹了兩類服務(wù)器組件的引入、屬性設(shè)定的規(guī)則,對綁定的支持是ASP.NET的新內(nèi)容,注意不要把綁定語法<%#%>跟服務(wù)端代碼聲明搞混了。

推薦閱讀
  1. 國家職業(yè)資格考試《職業(yè)道德》過關(guān)必做2000題(含歷年真題)
  2. 社會工作法規(guī)與政策(中級)2019年考點精講
  3. 幼兒園教師資格考試:綜合素質(zhì)(微課版)
  4. 2019年水利部黃河水利委員會招聘考試《職業(yè)能力測驗》過關(guān)必做習(xí)題集(含歷年真題)
  5. 人力資源管理專業(yè)知識與實務(wù)十年真題精析(中級)(2016版)
  6. 2019年山西省農(nóng)村信用社公開招聘工作人員考試復(fù)習(xí)全書【核心講義+歷年真題詳解】
  7. 2020年新疆維吾爾自治區(qū)社區(qū)工作者公開招聘考試《行政職業(yè)能力》專項題庫【真題精選+章節(jié)題庫+模擬試題】
  8. 物業(yè)管理師《物業(yè)管理實務(wù)》過關(guān)必做習(xí)題集(含歷年真題)
  9. 公共營養(yǎng)師(基礎(chǔ)知識)過關(guān)必做習(xí)題集(含歷年真題)
  10. 智慧教育實踐
  11. 汽車駕駛考證全程通(第2版)
  12. 2019年下半年銀行業(yè)專業(yè)人員職業(yè)資格考試《銀行業(yè)法律法規(guī)與綜合能力(中級)》歷年真題及詳解
  13. 2019年股份制銀行招聘考試題庫【章節(jié)題庫+模擬試題】
  14. 2019年全國導(dǎo)游人員資格考試輔導(dǎo)教材-青海導(dǎo)游基礎(chǔ)知識
  15. 2020年遼寧省社區(qū)工作者公開招聘考試《行政職業(yè)能力》專項題庫【歷年真題+章節(jié)題庫+模擬試題】
主站蜘蛛池模板: 曲沃县| 石楼县| 沙雅县| 海兴县| 游戏| 阿城市| 田东县| 蕲春县| 长岭县| 通化市| 潞城市| 兴隆县| 平陆县| 商都县| 东乡县| 龙南县| 本溪市| 彰化市| 祁阳县| 鹤壁市| 青田县| 南涧| 昭平县| 嘉峪关市| 饶阳县| 开江县| 阳曲县| 山西省| 永修县| 葵青区| 济阳县| 邵阳县| 广河县| 康乐县| 滦平县| 永德县| 宜州市| 浠水县| 平舆县| 马鞍山市| 北辰区|