設計ASP.NET MVC4應用程式(5)-使用ADO.NET設計資料庫應用程式

by vivid 22. 五月 2013 16:33

.NET Magazine國際中文電子雜誌
者:許薰尹
稿:張智凱
文章編號:N130513602
出刊日期:2013/5/22

網站應用程式或多或少需要整合資料庫,呈現資料庫內容,或讓使用者新增、刪除、修改、查詢資料庫資料。本篇文章將介紹如何建立一個ASP.NET MVC4應用程式,並利用ADO.NET來設計資料存取程式碼。

建立ASP.NET MVC4應用程式專案

我們從建立ASP.NET MVC4應用程式專案開始。從Visual Studio 2012開發工具 -「檔案」-「新增」-「專案」,在「新增專案」對話盒中選取程式語言,例如本範例選擇「Visual C#」,從「Web」分類中,選取「ASP.NET MVC 4 Web應用程式」,取一個名稱;按下「確定」鍵,請參考下圖所示:

clip_image002

圖 1:建立ASP.NET MVC4應用程式專案。

在「新ASP.NET MVC 4專案」對話盒中選取「基本」類型範本:

clip_image004

圖 2:「新ASP.NET MVC 4專案」對話盒。

修改web.config檔案中預設的連接字串,這個範例將連接到本機sqlexpress上的pubs資料庫:

<connectionStrings>

<add name = "DefaultConnection" providerName = "System.Data.SqlClient" connectionString = "Data Source=.\sqlexpress;Initial Catalog=pubs;Integrated Security=SSPI;" />

</connectionStrings>

 

設計Controller

從Visual Studio 2012開發工具-「方案總管」-你的專案-「Controllers」目錄上方按滑鼠右鍵,從快捷選單選擇「加入」-「控制器」,請參考下圖所示:

clip_image006

圖 3:新增控制器。

在「加入控制器」對話盒中,將控制器名稱設定為「HomeController」,範本選擇「具有空白讀取/寫入動作的MVC控制器」,然後按下「加入」按鈕,請參考下圖所示:

clip_image008

圖 4:建立HomeController控制器。

在HomeController.cs檔案最上方加上using語法匯入System.Data.SqlClient與System.Configuration命名空間。然後在HomeController類別階層宣告一個connectionString變數,使用ConfigurationManager.ConnectionStrings語法傳入索引鍵值「DefaultConnection」,就可以取得組態檔案中對應的連線字串,將連線字串記錄在connectionString變數中:

using System.Data.SqlClient;
using System.Configuration;

namespace MvcADONET.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        string connectionString = ConfigurationManager.ConnectionStrings [ "DefaultConnection" ].ConnectionString;
        public ActionResult Index( )        {

            SqlDataAdapter da = new
                SqlDataAdapter( "select * from stores" , connectionString );
            System.Data.DataTable dt = new System.Data.DataTable( );
            da.Fill( dt );
            return View( dt );
        }

…略

 


修改Index方法,在方法中宣告並建立一個SqlDataAdapter實體,在建構函式中傳入SQL查詢命令,查詢所有stores資料表資料;第二個參數則為連線字串。接著建立DataTable實體,並叫用DataAdapter的Fill方法填入資料,最後將DataTable傳入Controller的View方法,以便將資料傳到檢視。

將滑鼠停留在Index action程式碼上方,按滑鼠右鍵,從快捷選單選取「加入檢視」,請參考下圖所示:

clip_image010

圖 5:加入檢視。

在「加入檢視」對話盒,設定檢視名稱為「Index」,其它保留預設值,按下「加入」按鈕,請參考下圖所示:

clip_image012

圖 6:加入檢視。

完成這個步驟之後,專案中「Views」下的「Home」子目錄,裏頭會建立一個Index.cshtml,加入以下程式碼,在檔案上方,利用@model定義模型為DataTable,接著利用ColumnName取得欄位名稱;在foreach迴圈之中讀取DataTable中每一個DataRow物件,利用欄位名稱取得欄位值:

@model System.Data.DataTable
@{
    ViewBag.Title = "Index";
}

<h2> Index </h2>

<p>
    @Html.ActionLink( "Create New", "Create" )
</p>
<table>
    <tr>
        <th>
            @Model.Columns[0].ColumnName
        </th>
        <th>
            @Model.Columns[1].ColumnName
        </th>
        <th>
          @Model.Columns[2].ColumnName
        </th>
        <th>
           @Model.Columns[3].ColumnName
        </th>
        <th>
           @Model.Columns[4].ColumnName
        </th>
        <th>
           @Model.Columns[5].ColumnName
        </th>
        <th> </th>
    </tr>

 
@foreach ( System.Data.DataRow item in Model.Rows )
{
    <tr>
        <td>
            @Html.DisplayFor( modelItem => item["stor_id"] )
        </td>
        <td>
            @Html.DisplayFor( modelItem => item["stor_name"] )
        </td>
        <td>
            @Html.DisplayFor( modelItem => item["stor_address"] )
        </td>
        <td>
            @Html.DisplayFor( modelItem => item["city"] )
        </td>
        <td>
            @Html.DisplayFor( modelItem => item["state"] )
        </td>
        <td>
            @Html.DisplayFor( modelItem => item["zip"] )
        </td>
        <td>
            @Html.ActionLink( "Edit", "Edit", new {  id = item["stor_id"] }) |
            @Html.ActionLink( "Details", "Details", new { id = item["stor_id"] }) |
            @Html.ActionLink( "Delete", "Delete", new {id = item["stor_id"]  })
        </td>
    </tr>
}

</table>


按F5來執行程式,執行結果請參考下圖所示:

clip_image014

圖 7:查詢Pubs資料庫stores資料表所有資料。

顯示明細資料(Details)

我們可以在Controller的Details方法中撰寫程式碼,讀取特定一筆資料庫的資料。Details方法將傳入一個id變數,其值為欲查詢的stor-id。修改Controller中的Details方法加入以下程式碼,定義並建立SqlDataAdapter物件,並在建構函式傳入SQL查詢語法與連線字串當作初始值。

public ActionResult Details( int id )
{
    SqlDataAdapter da = new
       SqlDataAdapter( "select * from stores where stor_id=@stor_id" , connectionString );
    da.SelectCommand.Parameters.AddWithValue( "@stor_id" , id );
    System.Data.DataTable dt = new System.Data.DataTable( );
    da.Fill( dt );

    var store = new
    {
        stor_id = dt.Rows [0][0] ,
        stor_name = dt.Rows[0][1].ToString( ),
        stor_address = dt.Rows[0][2].ToString( ),
        city = dt.Rows[0][3].ToString( ),
        state = dt.Rows[0][4].ToString( ) ,
        zip = dt.Rows[0][5].ToString( )
    };
    return View( store );
}


查詢字串中指定一個名為@stor_id的參數,範例中呼叫SqlParameterCollection物件的AddWithValue方法,建立一個SqlParameter物件,將參數命名為「@stor_id」,並設定參數的值為Details方法傳入的值。最後叫用DataAdapter的Fill方法填資料到DataTable,最後將DataTable中第一筆資料的值讀取出來,包裝成一個匿名類別,傳入Controller的View方法,以便將資料傳到檢視。

將滑鼠停留在Details action程式碼上方,按滑鼠右鍵,從快捷選單選取「加入檢視」。在「加入檢視」對話盒,設定檢視名稱為「Details」,其它保留預設值,按下「加入」按鈕,請參考下圖所示:

clip_image016

圖 8:建立Details檢視。

因為Controller傳入匿名型別,若要在檢視中讀取匿名型別的資料,可以利用ViewData物件,再叫用Eval方法將資料轉成字串型別:

@{
    ViewBag.Title = "Details";
}
<h2> Details </h2>
<fieldset>
    <legend> store </legend>
    <div class = "display-label">
        stor_id
    </div>
    <div class = "display-field">
        @ViewData.Eval( "stor_id" )
    </div>
    <div class = "display-label">
        stor_name
    </div>
    <div class = "display-field">
        @ViewData.Eval( "stor_name" )
    </div>

    <div class = "display-label">
        stor_address
    </div>
    <div class = "display-field">
        @ViewData.Eval( "stor_address" )
    </div>

    <div class = "display-label">
        city
    </div>
    <div class = "display-field">
        @ViewData.Eval( "city" )
    </div>
    <div class = "display-label">
        state
    </div>
    <div class = "display-field">
        @ViewData.Eval( "state" )
    </div>
    <div class = "display-label">
        zip
    </div>
    <div class = "display-field">
        @ViewData.Eval( "zip" )

    </div>
</fieldset>
<p>
    @Html.ActionLink( "Edit" , "Edit" , new { id = ViewData.Eval( "stor_id" )} ) |
    @Html.ActionLink( "Back to List" , "Index" )
</p>


按F5來執行程式,執行結果請參考下圖所示:

clip_image018

圖 9:Details.aspx。

新增資料(Create)

Details方法使用匿名型別傳遞資料到控制器,語法較易寫錯,比較建議的作法是利用模型,傳遞強型的模型到檢視。新增資料的部分就改用模型來設計,在目前的專案之中加入一個資料模型類別,從Visual Studio 2012開發工具-「方案總管」-你的專案-「Models」目錄上方按滑鼠右鍵,從快捷選單選擇「加入」-「類別」,設定名稱為「store」,然後按下「新增」按鈕,請參考下圖所示:

clip_image020

圖 10:新增模型。

我們定義store類別中包含三個屬性:stor_id、stor_name、stor_address、city、state與zip:

 

namespace MvcADONET.Models
{
    public  class store
    {
        public string stor_id { get; set; }
        public string stor_name { get; set; }
        public string stor_address { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public string zip { get; set; }
    }
}

 

修改Controller,在檔案上方匯入Models命名空間:

 

using MvcADONET.Models;

在不帶參數的Create方法中回傳View,在有加上HttpPost attribute的Create方法中,利用ADO.NET新增資料:

public ActionResult Create( )
     {
         return View( );
     }

     //
     // POST: /Home/Create

     [HttpPost]
     public ActionResult Create( FormCollection collection )
     {
         try
         {
             SqlConnection cn = new SqlConnection(connectionString );
             SqlCommand cmd = new SqlCommand(
                 "insert into stores values(@stor_id ,@stor_name,@stor_address,@city,@state,@zip)" , cn );
             cmd.Parameters.AddWithValue( "@stor_id" , collection [ "stor_id" ] );
             cmd.Parameters.AddWithValue( "@stor_name" , collection [ "stor_name" ] );
             cmd.Parameters.AddWithValue( "@stor_address" , collection [ "stor_address" ] );
             cmd.Parameters.AddWithValue( "@city" , collection [ "city" ] );
             cmd.Parameters.AddWithValue( "@state" , collection [ "state" ] );
             cmd.Parameters.AddWithValue( "@zip" , collection [ "zip" ] );
      
             cn.Open( );
             cmd.ExecuteNonQuery( );
             cn.Close( );
             return RedirectToAction( "Index" );
         }
         catch ( Exception ex )
         {
             return View( );
         }
     }

 

定義並建立SqlConnection 與SqlCommand物件,在SqlCommand建構函數傳入insert SQL語法,與連接字串。呼叫SqlParameterCollection物件的AddWithValue方法,分別為@stor_id、@stor_name、@stor_address、@city、@state與@zip參數建立SqlParameter物件,設定參數名稱與參數值。呼叫SqlConnection物件的Open方法開啟資料庫連線,然後利用SqlCommand物件的ExecuteNonQuery方法,執行新增資料動作,並關閉資料庫連線。

將滑鼠停留在Create action程式碼上方,按滑鼠右鍵,從快捷選單選取「加入檢視」。在「加入檢視」對話盒,設定檢視名稱為「Create」,勾選「建立強型別檢視」,於「模型類別」下方的文字方塊中,選取「store」 ;Scaffold樣版設定為「Create」,其它保留預設值,然後按下「加入」按鈕,請參考下圖所示:

clip_image022

圖 11:加入檢視。

Visual Studio 2012自動產生的Create.cshtml內容如下:

@model MvcADONET.Models.store

@{
    ViewBag.Title = "Create";
}

<h2> Create </h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend> store </legend>

        <div class = "editor-label">
            @Html.LabelFor( model => model.stor_id )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.stor_id )
            @Html.ValidationMessageFor( model => model.stor_id )
        </div>

        <div class = "editor-label">
            @Html.LabelFor( model => model.stor_name )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.stor_name )
            @Html.ValidationMessageFor( model => model.stor_name )
        </div>

        <div class = "editor-label">
            @Html.LabelFor( model => model.stor_address )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.stor_address )
            @Html.ValidationMessageFor( model => model.stor_address )
        </div>

        <div class = "editor-label">
            @Html.LabelFor( model => model.city )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.city )
            @Html.ValidationMessageFor( model => model.city )
        </div>

        <div class = "editor-label">
            @Html.LabelFor( model => model.state )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.state )
            @Html.ValidationMessageFor( model => model.state )
        </div>

        <div class = "editor-label">
            @Html.LabelFor( model => model.zip )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.zip )
            @Html.ValidationMessageFor( model => model.zip )
        </div>

        <p>
            <input type = "submit" value = "Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink( "Back to List", "Index" )
</div>

@section Scripts {
    @Scripts.Render( "~/bundles/jqueryval" )
}


按F5來執行程式,執行結果請參考下圖所示,當你點選Index畫面上的「Create」連結時,便進入資料新增畫面:

clip_image024

圖 12:新增資料。

輸完資料按下「Create」按鈕資料便被新增到資料庫,並回到Index,新增的資料會馬上出現在畫面中:

clip_image026

圖 13:新增的資料會馬上出現在畫面中。

修改資料(Edit)

和新增資料的部分一樣,修改資料也使用模型來設計,修改HomeController.cs之中的兩個Edit方法,如下所示,第一個Edit方法會傳入要修改的store id值,利用ADO.NET查詢資料庫要修改的資料,包裝在store物件,然後當做View的參數。第二個Edit方法,則傳入兩個參數,第一個是要修改的store id,第二個參數是store物件,然後利用ADO.NET修改資料庫資料。

public ActionResult Edit( int id )
    {
        SqlDataAdapter da = new
              SqlDataAdapter( "select * from stores where stor_id=@stor_id" , connectionString);
        da.SelectCommand.Parameters.AddWithValue( "@stor_id" , id );
        System.Data.DataTable dt = new System.Data.DataTable( );
        da.Fill( dt );

        store s = new store
        {
            stor_id = dt.Rows[0][0].ToString( ) ,
            stor_name = dt.Rows[0][1].ToString( ) ,
            stor_address = dt.Rows[0][2].ToString( ) ,
            city = dt.Rows[0][3].ToString( ) ,
            state = dt.Rows[0][4].ToString( ) ,
            zip = dt.Rows[0][5].ToString( )
        };
        return View( s );
    }

    //
    // POST: /Home/Edit/5

    [HttpPost]
    public ActionResult Edit( int id , store s )
    {
        try
        {
            SqlConnection cn = new SqlConnection(connectionString );
            SqlCommand cmd = new SqlCommand( "UPDATE stores SET stor_name = @stor_name, stor_address = @stor_address, city = @city, state = @state , zip = @zip WHERE [stor_id] = @stor_id" , cn );
            cmd.Parameters.AddWithValue( "@stor_id" , s.stor_id );
            cmd.Parameters.AddWithValue( "@stor_name" , s.stor_name );
            cmd.Parameters.AddWithValue( "@stor_address" , s.stor_address );
            cmd.Parameters.AddWithValue( "@city" , s.city );
            cmd.Parameters.AddWithValue( "@state" , s.state );
            cmd.Parameters.AddWithValue( "@zip" , s.zip );
           
            cn.Open( );
            cmd.ExecuteNonQuery( );
            cn.Close( );
           
            return RedirectToAction( "Index" );
        }
        catch (Exception ex)
        {
            return View( );
        }
    }

將滑鼠停留在Edit action程式碼上方,按滑鼠右鍵,從快捷選單選取「加入檢視」。在「加入檢視」對話盒,設定檢視名稱為「Edit」,勾選「建立強型別檢視」,於「模型類別」下方的文字方塊中,選取「store」 ;Scaffold樣版設定為「Edit」,其它保留預設值,然後按下「加入」按鈕,請參考下圖所示:

clip_image028

圖 14:加入檢視。

Visual Studio 2012自動產生的Edit.cshtml內容如下:

@model MvcADONET.Models.store
@{
    ViewBag.Title = "Edit";
}
<h2> Edit </h2>
@using ( Html.BeginForm( ) )
{
    @Html.AntiForgeryToken( )
    @Html.ValidationSummary( true )
    <fieldset>
        <legend> store </legend>
        <div class = "editor-label">
            @Html.LabelFor( model => model.stor_id )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.stor_id )
            @Html.ValidationMessageFor( model => model.stor_id )
        </div>
        <div class = "editor-label">
            @Html.LabelFor( model => model.stor_name )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.stor_name )
            @Html.ValidationMessageFor( model => model.stor_name )
        </div>
        <div class = "editor-label">
            @Html.LabelFor( model => model.stor_address )
        </div>
        <div class= "editor-field">
            @Html.EditorFor( model => model.stor_address )
            @Html.ValidationMessageFor( model => model.stor_address )
        </div>
        <div class = "editor-label">
            @Html.LabelFor( model => model.city )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.city )
            @Html.ValidationMessageFor( model => model.city )
        </div>
        <div class="editor-label">
            @Html.LabelFor( model => model.state )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.state )
            @Html.ValidationMessageFor( model => model.state )
        </div>
        <div class = "editor-label">
            @Html.LabelFor( model => model.zip )
        </div>
        <div class = "editor-field">
            @Html.EditorFor( model => model.zip )
            @Html.ValidationMessageFor( model => model.zip )
        </div>
        <p>
            <input type = "submit" value = "Save" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink( "Back to List" , "Index" )
</div>

按F5來執行程式,執行結果請參考下圖所示,當你點選Index畫面上任一筆資料的「Edit」連結時,便進入資料編輯畫面:

clip_image030

圖 15:編輯資料。

修改完資料按下「Save」按鈕資料便被新增到資料庫,並回到Index,修改的資料會馬上出現在畫面中:

clip_image032

圖 16:修改資料。

刪除資料(Delete)

最後設計資料刪除。修改HomeController.cs之中的兩個Delete方法,如下所示,第一個Delete方法會傳入要刪除的store id值,利用ADO.NET查詢資料庫要修改的資料,包裝在store物件,然後當做View的參數。第二個Delete方法,則傳入兩個參數,第一個是要刪除的store id,第二個參數是FormCollection物件,目前用不到此參數,最後利用ADO.NET刪除資料庫資料:

public ActionResult Delete( int id )
        {
            SqlDataAdapter da = new
                 SqlDataAdapter( "select * from stores where stor_id=@stor_id" , connectionString );
            da.SelectCommand.Parameters.AddWithValue( "@stor_id" , id );
            System.Data.DataTable dt = new System.Data.DataTable( );
            da.Fill( dt );

            store s = new store
            {
                stor_id = dt.Rows[0][0].ToString( ) ,
                stor_name = dt.Rows[0][1].ToString( ) ,
                stor_address = dt.Rows[0][2].ToString( ) ,
                city = dt.Rows[0][3].ToString( ) ,
                state = dt.Rows[0][4].ToString( ) ,
                zip = dt.Rows[0][5].ToString( )
            };
            return View( s );
        }

        //
        // POST: /Home/Delete/5

        [HttpPost]
        public ActionResult Delete( int id , FormCollection collection )
        {
            try
            {
                // TODO: Add delete logic here
                SqlConnection cn = new SqlConnection( connectionString );
                SqlCommand cmd = new SqlCommand( "delete [stores] where [stor_id] = @stor_id" , cn );
                cmd.Parameters.AddWithValue( "@stor_id" , id );

                cn.Open( );
                cmd.ExecuteNonQuery( );
                cn.Close( );
                return RedirectToAction( "Index" );           
            }
            catch
            {
                return View( );
            }
        }
    }


將滑鼠停留在Delete action程式碼上方,按滑鼠右鍵,從快捷選單選取「加入檢視」。在「加入檢視」對話盒,設定檢視名稱為「Delete」,勾選「建立強型別檢視」,於「模型類別」下方的文字方塊中,選取「store」 ;Scaffold樣版設定為「Delete」,其它保留預設值,然後按下「加入」按鈕,請參考下圖所示:

clip_image034

圖 17:加入檢視。

Visual Studio 2012自動產生的Delete.cshtml內容如下:

@model MvcADONET.Models.store

@{
    ViewBag.Title = "Delete";
}

<h2> Delete </h2>

<h3> Are you sure you want to delete this? </h3>
<fieldset>
    <legend> store </legend>

    <div class = "display-label">
         @Html.DisplayNameFor( model => model.stor_id )
    </div>
    <div class = "display-field">
        @Html.DisplayFor( model => model.stor_id )
    </div>

    <div class = "display-label">
         @Html.DisplayNameFor( model => model.stor_name )
    </div>
    <div class = "display-field">
        @Html.DisplayFor( model => model.stor_name )
    </div>

    <div class = "display-label">
         @Html.DisplayNameFor( model => model.stor_address )
    </div>
    <div class = "display-field">
        @Html.DisplayFor( model => model.stor_address )
    </div>

    <div class = "display-label">
         @Html.DisplayNameFor( model => model.city )
    </div>
    <div class = "display-field">
        @Html.DisplayFor( model => model.city )
    </div>

    <div class = "display-label">
         @Html.DisplayNameFor( model => model.state )
    </div>
    <div class = "display-field">
        @Html.DisplayFor( model => model.state )
    </div>

    <div class = "display-label">
         @Html.DisplayNameFor( model => model.zip )
    </div>
    <div class = "display-field">
        @Html.DisplayFor( model => model.zip )
    </div>
</fieldset>
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    <p>
        <input type = "submit" value = "Delete" /> |
        @Html.ActionLink( "Back to List", "Index" )
    </p>
}


 

按F5來執行程式,執行結果請參考下圖所示:

clip_image036

圖 17:刪除資料。

Tags:

.NET Magazine國際中文電子雜誌 | ASP.NET MVC | 許薰尹Vivid Hsu

評論 (64) -

Pierre Chou
Pierre Chou Taiwan
2013/12/4 下午 07:07:48 #

very good useful article

回覆

cours de theatre
cours de theatre United States
2017/9/30 下午 12:40:12 #

Im obliged for the post. Keep writing.

回覆

dic phoenix
dic phoenix United States
2017/10/6 下午 11:52:36 #

wow, awesome post.Really thank you! Much obliged.

回覆

buy hacklink
buy hacklink United States
2017/10/9 下午 01:47:30 #

Im thankful for the article post.Really looking forward to read more. Really Cool.

回覆

sklep z kamagra
sklep z kamagra United States
2017/10/9 下午 03:24:53 #

Thanks-a-mundo for the blog post.Thanks Again. Awesome.

回覆

solarmovie
solarmovie United States
2017/10/10 下午 07:29:53 #

Thanks so much for the blog. Really Cool.

回覆

Nathan Coombe
Nathan Coombe United States
2017/10/10 下午 09:36:28 #

Very good blog.Really thank you! Want more.

回覆

blog link
blog link United States
2017/10/14 下午 03:35:45 #

Awesome blog post.Really thank you! Cool.

回覆

omega xl review
omega xl review United States
2017/10/15 下午 07:45:30 #

Appreciate you sharing, great blog post.Much thanks again. Really Cool.

回覆

learn this here now
learn this here now United States
2017/10/17 下午 02:21:57 #

Really informative article.Much thanks again. Will read on...

回覆

sletrokor
sletrokor United States
2017/10/17 下午 07:53:50 #

A round of applause for your article. Keep writing.

回覆

Opal Skyview
Opal Skyview United States
2017/10/19 上午 05:16:25 #

I truly appreciate this blog.Thanks Again.

回覆

VigRx Plus Review
VigRx Plus Review United States
2017/10/19 上午 06:58:05 #

wow, awesome article.Thanks Again. Will read on...

回覆

check my blog
check my blog United States
2017/10/19 下午 05:48:48 #

A round of applause for your blog post. Fantastic.

回覆

pure slim 1000 review
pure slim 1000 review United States
2017/10/20 上午 03:19:33 #

Muchos Gracias for your post.Thanks Again. Much obliged.

回覆

Osimi Sea View
Osimi Sea View United States
2017/10/21 上午 03:03:25 #

I loved your blog article. Want more.

回覆

carte grise en ligne
carte grise en ligne United States
2017/10/21 上午 06:41:20 #

Very good article.Thanks Again. Really Cool.

回覆

kassa
kassa United States
2017/10/21 下午 05:05:30 #

Thanks for the post. Awesome.

回覆

website designing company in Delhi India
website designing company in Delhi India United States
2017/10/24 上午 11:09:10 #

Looking forward to reading more. Great article.

回覆

son thinh
son thinh United States
2017/10/28 上午 10:13:51 #

Thanks for sharing, this is a fantastic blog article.Much thanks again. Want more.

回覆

EZ Battery Reconditioning
EZ Battery Reconditioning United States
2017/10/30 上午 09:06:51 #

Appreciate you sharing, great blog post.Really looking forward to read more. Really Cool.

回覆

lepszy plock
lepszy plock United States
2017/10/30 下午 04:52:21 #

Really appreciate you sharing this article post.Much thanks again. Will read on...

回覆

life leadership
life leadership United States
2017/11/1 上午 09:21:19 #

Looking forward to reading more. Great article post.Much thanks again. Really Great.

回覆

phenocal
phenocal United States
2017/11/1 下午 04:47:47 #

Thank you ever so for you article. Keep writing.

回覆

phentaslim
phentaslim United States
2017/11/3 下午 01:50:27 #

Thank you ever so for you article.Really looking forward to read more. Will read on...

回覆

spinal stenosis treatment exercises
spinal stenosis treatment exercises United States
2017/11/15 上午 07:55:11 #

Wow, great post.Really looking forward to read more. Cool.

回覆

avocat criminel montreal
avocat criminel montreal United States
2017/11/16 下午 06:30:49 #

Thanks a lot for the post.Much thanks again. Keep writing.

回覆

trace indian mobile number location
trace indian mobile number location United States
2017/11/22 上午 03:10:52 #

wow, awesome blog article.Really looking forward to read more.

回覆

swimwear
swimwear United States
2017/11/23 下午 09:59:18 #

Very neat article post.Really looking forward to read more. Keep writing.

回覆

Adwords Management Auckland
Adwords Management Auckland United States
2017/11/25 下午 06:56:43 #

I appreciate you sharing this blog article.Much thanks again. Really Great.

回覆

Chad Boonswang and Jeffrey Goodman
Chad Boonswang and Jeffrey Goodman United States
2017/11/26 下午 06:06:23 #

Wow, great post.Really thank you! Really Great.

回覆

Chad Boonswang SEO
Chad Boonswang SEO United States
2017/11/27 上午 12:11:35 #

I really liked your blog post.

回覆

fake car wreckers
fake car wreckers United States
2017/11/29 下午 04:33:49 #

Thank you ever so for you article post.Really looking forward to read more. Keep writing.

回覆

Osimi Sea view
Osimi Sea view United States
2017/11/29 下午 11:09:59 #

I really like and appreciate your blog.Much thanks again. Really Great.

回覆

Get Business Credit
Get Business Credit United States
2017/12/1 上午 12:58:54 #

I cannot thank you enough for the blog article.Much thanks again. Much obliged.

回覆

Initial coin offering
Initial coin offering United States
2017/12/3 上午 04:57:50 #

I am so grateful for your article post.Really looking forward to read more. Great.

回覆

mobile porno
mobile porno United States
2017/12/5 上午 09:45:08 #

Im obliged for the article post.Thanks Again. Fantastic.

回覆

I value the article.Much thanks again. Keep writing.

回覆

http://minutemobile.bid/story.php?id=11063
http://minutemobile.bid/story.php?id=11063 United States
2017/12/10 上午 08:56:15 #

Major thanks for the blog. Awesome.

回覆

dorty lawyer
dorty lawyer United States
2017/12/10 下午 07:21:54 #

Really enjoyed this article. Much obliged.

回覆

Rosendo Sylvest
Rosendo Sylvest United States
2017/12/14 上午 09:29:09 #

I really liked your post.Thanks Again. Want more.

回覆

i thought about this
i thought about this United States
2017/12/14 下午 04:20:51 #

Say, you got a nice blog.Really looking forward to read more. Awesome.

回覆

Hanukkah
Hanukkah United States
2017/12/14 下午 10:52:34 #

This is one awesome post.Thanks Again. Cool.

回覆

canon driver software
canon driver software United States
2017/12/16 下午 06:02:53 #

Major thankies for the article.Really thank you! Awesome.

回覆

green coffee bean
green coffee bean United States
2017/12/17 上午 12:20:24 #

I loved your blog article.Really looking forward to read more.

回覆

I truly appreciate this blog.Really looking forward to read more. Cool.

回覆

Analytical
Analytical United States
2017/12/17 下午 05:43:20 #

Very informative blog article.Really looking forward to read more. Awesome.

回覆

Full Report
Full Report United States
2017/12/18 上午 12:46:44 #

Really enjoyed this blog.Really thank you! Much obliged.

回覆

work online
work online United States
2017/12/20 下午 06:56:14 #

I think this is a real great article post.Much thanks again. Want more.

回覆

Darwin Horan
Darwin Horan United States
2017/12/23 下午 07:59:41 #

A big thank you for your blog.Much thanks again. Much obliged.

回覆

Thanks-a-mundo for the blog.Really looking forward to read more. Great.

回覆

driver hp
driver hp United States
2017/12/25 下午 09:28:22 #

I cannot thank you enough for the article.Thanks Again. Really Cool.

回覆

I loved your blog article.Thanks Again. Awesome.

回覆

Say, you got a nice article post.Really looking forward to read more.

回覆

SOCCER HIGHLIGHTS
SOCCER HIGHLIGHTS United States
2017/12/26 下午 05:08:14 #

I really like and appreciate your blog article.Really thank you! Cool.

回覆

canon printer series
canon printer series United States
2017/12/27 下午 09:06:35 #

Major thanks for the article.Really looking forward to read more. Great.

回覆

hp drivers
hp drivers United States
2018/1/2 上午 11:41:07 #

Thank you for your article post.Thanks Again.

回覆

my blog
my blog United States
2018/1/2 下午 07:49:30 #

A round of applause for your article post. Will read on...

回覆

Epson drivers
Epson drivers United States
2018/1/3 上午 11:02:30 #

Thank you for your blog article.Really looking forward to read more. Really Great.

回覆

online casino usa real money
online casino usa real money United States
2018/1/4 下午 09:50:57 #

Really enjoyed this blog post.Really thank you! Will read on...

回覆

hp printer driver
hp printer driver United States
2018/1/5 下午 03:42:40 #

Wow, great article.Really thank you! Much obliged.

回覆

FBA
FBA United States
2018/1/6 上午 07:46:55 #

Im thankful for the blog article.Really thank you! Really Cool.

回覆

colocation miami
colocation miami United States
2018/1/10 上午 07:23:45 #

Appreciate you sharing, great article. Much obliged.

回覆

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List