設計ASP.NET MVC4應用程式(4)

by vivid 30. 一月 2013 12:48

.NET Magazine國際中文電子雜誌
作 者:許薰尹
審 稿:張智凱
文章編號:N130113203
出刊日期:2013/1/30

本文延續《設計ASP.NET MVC4應用程式(3)》一文探討在ASP.NET MVC 4類型的專案中,使用一些用戶端的Framework來設計網站應用程式,本文將探討AJAX輔助程式,透過它來建立非同步的連結與表單。

 

使用Unobtrusive JavaScript

Unobstrusive Javascript在MVC 3版時引進,提供一些AJAX 輔助程式,讓你在MVC專案之中使用jQuery以及發出AJAX請求時,語法更為簡便。

Unobstrusive Javascript實踐了讓JavaScript與標籤(markup)完全分離的做法。在MVC 4專案Scripts目錄下也會自動加入jquery.unobtrusive-ajax.js與jquery.unobtrusive-ajax.min.js檔案,而Web.config組態檔案中,預設就會啟用Unobtrusive JavaScript:

 

<add key="UnobtrusiveJavaScriptEnabled" value="true" />

Unobtrusive JavaScript好處:

  • 遵循MVC開發模式,將標籤與JavaScript程式碼分離。
  • 將所需的JavaScript包在*.js檔案,瀏覽器可以個別下載這些檔案,並將它們快取在本機電腦,以提升整體執行效能。
  • 可以達成漸近增強(Progressive enhancement):Progressive enhancement專注在內容傳遞的動作,只有在你的裝置或瀏覽器支援某些功能,如CSS樣式,或某些HTML5標準,你的網頁才會執行一些進階的動作,例如動畫特效。ASP.NET MVC 4將漸近增強(Progressive enhancement)的想法引進JavaScript,不在檢視(View)中以JavaScript程式碼來啟用用戶端驗證的功能,而是在HTML Attribute加入一些描述資訊,以便在用戶端不支援此功能時網站還能正確地運作。

Ajax Helper

ASP.NET MVC提供了Ajax輔助程式(Ajax Helper)建立表單、連結,可以使用非同步的方式來執行,而且你不需要撰寫太多JavaScript程式碼。因為Ajax Helper需要使用到jquery.unobtrusive-ajax.js函式庫,因此你可以修改_Layout.cshtml檔案來引用它,例如以下範例,利用Scripts.Render引用jqueryval (jqueryval是Visual Studio 2012工具為jquery.unobtrusive-ajax.js函式庫取的別名,定義在BundleConfig.cs檔案之中):

 

<!DOCTYPE html>
<html>
<head>
    <meta charset = "utf-8" />
    <meta name = "viewport" content = "width=device-width" />
    <title> @ViewBag.Title </title>
    @Styles.Render( "~/Content/css" )
    @Scripts.Render( "~/bundles/modernizr" )
</head>
<body>
    @RenderBody()
    @Scripts.Render( "~/bundles/jquery", "~/bundles/jqueryval" )
    @RenderSection( "scripts",  required: false )
</body>
</html>


接下來我們一樣以一個範例來說明使用Ajax Helper來產生超連結與表單來執行非同步作業。

 

加入模型

在專案之中加入一個資料模型(Data Model)類別,從Visual Studio 2012開發工具-「方案總管」-專案-「Models」目錄上方按滑鼠右鍵,從快捷選單選擇「加入」-「類別」,設定名稱為「CourseListModel」,然後按下「新增」按鈕,請參考下圖所示:

clip_image002

圖 1:加入模型。

在CourseListModel.cs中定義一個CourseListModel與CourseDetails類別,CourseListModel類別中包含課程資料;而CourseDetails類別則包含每個課程的詳細說明:

namespace MvcApplication1.Models {
  public class CourseListModel {
    public List<CourseDetails> Items = new List<CourseDetails>( ) {
        new CourseDetails() {
          ID = 1 ,
          Name = "ASP.NET MVC" ,
          Description = "ASP.NET MVC 可以建立網站應用程式。",
          Length = 5 },
        new CourseDetails() {
          ID = 2 ,
          Name = "C#" ,
          Description = "C#是個好用的程式語言。",
          Length = 4 },
        new CourseDetails() {
          ID = 3 ,
          Name = "Visual Basic" ,
          Description = "Visual Basic的語法簡易易學。",
          Length = 4}
    };
  }

  public class CourseDetails {
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int Length { get; set; }
  }
}

 

建立控制器

在專案之中加入一個控制器,從「方案總管」-專案-「Controllers」目錄上方按滑鼠右鍵,從快捷選單選取「加入」-「控制器」,為控制器取一個名稱,例如本範例中的「CourseController」,請參考下圖所示:

clip_image004

圖 2:建立CourseController。

在CourseController加入以下程式碼,Index 動作則是用來顯示課程列表;Details動作用來顯示課程明細;Edit動作用來修改課程資料:

 

using MvcApplication1.Models;
namespace MvcApplication1.Controllers {
  public class CourseController : Controller {
    static CourseListModel m = new CourseListModel( );
    public ActionResult Index( ) {
      return View( m );
    }
    public PartialViewResult Details( int id ) {
      CourseDetails details = m.Items.Find(  i => i.ID == id );
      return PartialView(  "_PartialCourse" , details );
    }
    public PartialViewResult Edit( int id ) {
      CourseDetails details = m.Items.Find(  i => i.ID == id );
      return PartialView(  "_PartialEdit" , details );
    }
    [HttpPost]
    public ActionResult Edit( int id , CourseDetails d ) {
      CourseDetails details = m.Items.Find(  i => i.ID == id );
      m.Items.Remove( details );
      m.Items.Add( d );
      return RedirectToAction( "Index" );
    }
  }
}


CSS樣式

在Content目錄下的Site.css檔案中,定義以下自訂CSS樣式:

.Parent {
    display : -moz-box;
    display : -ms-box;
    display : -webkit-box;
    width : 100%;
}

.Child1 ,.Child4 {
     padding : 0.5em;
     -moz-box-flex : 1;
    -ms-box-flex : 1;
    -webkit-box-flex : 1;
    Width : 100px;
    background-color : #f7fc81;
}

.Child2 {
   padding : 0.5em;
     -moz-box-flex : 1;
    -ms-box-flex : 1;
    -webkit-box-flex : 1;
    width : 200px;
    background-color : #f3f869;
}

.Child3 ,.Child5 {
    padding : 0.5em;
    -moz-box-flex : 2;
    -ms-box-flex : 2;
    -webkit-box-flex : 2;
    width : 200px;
   background-color : #f7fc81;
}


建立Index檢視

將滑鼠游標停留在CourseController類別Index方法上方按滑鼠右鍵,然後選取快捷選單上的「加入檢視」選項,請參考下圖所示:

clip_image005

圖 3:建立Index檢視。

勾選「建立強型別檢視」,於「模型類別」下方的文字方塊中,選取「CourseListModel」,勾選「使用配置或主版頁面」,從「選取版面配置頁」對話盒挑選「_Layout.cshtml」檔案,然後按下「確定」,再按下「加入」按鈕,請參考下圖所示:

clip_image006

圖 4:建立檢視。

修改Index.cshtml檔案如下:

@model MvcApplication1.Models.CourseListModel

@{
  ViewBag.Title = "Index";
  Layout = "~/Views/Shared/_Layout.cshtml" ;
}
<h2> Index </h2>
<h2> 課程清單 </h2>
@foreach ( var item in Model.Items ) {
  <div class = "Parent">
    <div class = "Child1">
      @Html.DisplayFor( modelItem => item.ID )
    </div>
    <div class = "Child2">
      @Html.DisplayFor( modelItem => item.Name )
    </div>
    <div class = "Child3">
      @Html.DisplayFor( modelItem => item.Description )
    </div>
    <div class = "Child4">
      @Html.DisplayFor( modelItem => item.Length )
    </div>
    <div class = "Child5">  
      @Ajax.ActionLink( "Edit" ,
                    "Edit" , "Course" , new { id = item.ID } ,
                    new AjaxOptions {
                      UpdateTargetId = "CourseDetails" ,
                      InsertionMode = InsertionMode.Replace ,
                      HttpMethod = "GET"
                    } )
      | 
       @Ajax.ActionLink( "明細" ,
                    "Details" , "Course" , new { id = item.ID } ,
                    new AjaxOptions {
                      UpdateTargetId = "CourseDetails" ,
                      InsertionMode = InsertionMode.Replace ,
                      HttpMethod = "GET"
                    } )
    </div>
  </div>
}
<div id = "CourseDetails">
</div>

 


你可以透過Ajax屬性存取Ajax Hepler,範例中使用到Ajax.ActionLink方法來產生「Edit」與「明細」兩個超連結,當使用者點選這兩個連結,則將課程編輯畫面,或明細畫面動態地顯示在名為CourseDetails的<div>標籤之中,不導向其它頁面來呈現課程的內容。

以「Edit」連結為例,第一個引數設定連結上要顯示的文字「Edit」;第二個引數為要叫用的動作之名稱「Edit」;第三個引數為控制器的名稱「Course」;第三個引數為路由參數,範例中透過此引數傳遞要編輯的課程編號(ID);第四個引數則是一個AjaxOptions物件,設定要以何種方式送出HTTP請求,以及伺服端執行完之後,後續想要執行的動作或伺服端執行發生錯誤時,想要執行的錯誤處理程式碼。

「Edit」連結AjaxOptions物件的UpdateTargetId屬性設定伺服器執行完後,要更新的DOM元素名稱,即範例中名為CourseDetails的<div>項目,它用來呈現編輯畫面。

InsertionMode設定為Replace表示要取代掉UpdateTargetId指定的元素之內容。HttpMethod則設定將使用HTTP的GET方法執行查詢。

 

測試與執行

在Visual Studio 2012中,按F5鍵來執行程式,在瀏覽器上輸入以下URL(請將埠號代換成實際的埠號):

http://localhost:埠號/

執行的結果如下圖所示:

clip_image008

圖 5:Course Index檢視。

Ajax.ActionLink方法指定的動作可以回傳HTML標籤,我們可以將他設計為部分檢視(Partial View),這樣就可以把取回的結果插入Index檢視的DOM物件之中。

加入部分檢視

將滑鼠游標停留在HomeController Details方法上方按滑鼠右鍵,然後選取快捷選單上的「加入檢視」選項,請參考下圖所示:

clip_image009

圖 6:加入檢視。

在「加入檢視」對話盒設定檢視的名稱為「_PartialCourse」。勾選「建立強型別檢視」,從「模型類別」下拉式清單方塊挑選「CourseDetails」,然後勾選「建立成部分檢視」,再按下「加入」按鈕,請參考下圖所示:

clip_image010

圖 7:建立成部分檢視」。

修改_PartialCourse.cshtml檔案如下,利用Model屬性讀取課程的編號、名稱、說明與天數來顯示:

@model MvcApplication1.Models.CourseDetails
<fieldset>
  <legend> 課程明細 </legend>

  代號 : <span> @Model.ID </span> <br />
  名稱 : <span> @Model.Name </span> <br />
  說明 : <span >@Model.Description </span> <br />
  天數 : <span> @Model.Length </span> <br />
</fieldset>

 

測試與執行

在Visual Studio 2012中,按F5鍵來執行程式,在瀏覽器上輸入以下URL(請將埠號代換成實際的埠號):

http://localhost:埠號/

執行的結果如下圖所示,當你點選「明細」連結時,便透過AJAX取得課程明細,顯示在下方,請參考下圖所示:

clip_image012

圖 8:透過AJAX取得課程明細,顯示在下方。

在執行時期,「明細」連結產生的HTML標籤如下,使用了jquery.unobtrusive-ajax.js函式庫,幾乎不需要額外的JavaScript程式碼就可以使用AJAX的技術,而是透過一些data開頭的attribute來設定執行的行為:

 

<a data-ajax = "true" data-ajax-method = "GET" data-ajax-mode = "replace" data-ajax-update = "#CourseDetails" href = "/Course/Details/1"> 明細 </a>

 

非同步表單

我們的範例還需要一個編輯課程的功能,需要設計一個表單讓使用者輸入資料,並將資料提交送到伺服端處理。在ASP.NET MVC 4中可以使用非同步表單的功能來處理。

 

加入_PartialEdit部分檢視

首先加入_PartialEdit部分檢視來顯示課程編輯畫面,將滑鼠游標停留在CourseController類別Index方法上方按滑鼠右鍵,然後選取快捷選單上的「加入檢視」選項。

在「加入檢視」對話盒設定檢視的名稱為「_PartialEdit」。勾選「建立強型別檢視」,從「模型類別」下拉式清單方塊挑選「CourseDetails」,然後勾選「建立成部分檢視」,再按下「加入」按鈕,請參考下圖所示:

clip_image013

圖 9:建立用來編輯的部分檢視。

修改_PartialEdit.cshtml檔案如下:

@model MvcApplication1.Models.CourseDetails
@{
  ViewBag.Title = "Edit Course" ;
  AjaxOptions ajaxOpts = new AjaxOptions {
    OnSuccess = "window.location='Course'"
  };
}
<h2> 編輯課程 </h2>
@using ( Ajax.BeginForm( "Edit" , ajaxOpts ) ) {
  <fieldset>
    <legend> Course Details </legend>

    @Html.HiddenFor(  model => model.ID  )

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

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

    <div class = "editor-label">
      @Html.LabelFor(  model => model.Length )
    </div>
    <div class = "editor-field">
      @Html.EditorFor(  model => model.Length )
    </div>
    <p>
      <input type = "submit" value = "存檔"  />
    </p>
  </fieldset> 
}


我們使用Ajax.BeginForm方法來產生HTML表單,當使用者按下「存檔」按鈕就會以HTTP GET方法送出表單內容到「Edit」動作。此外範例設定了AjaxOptions的OnSuccess屬性,在編輯動作成功執行後,叫用window.location='Course',重新執行Index檢視,以更新課程清單的內容成最新值。

Ajax.BeginForm方法產生的標籤參考如下:

 

<form action = "/Course/Edit/3" data-ajax = "true" data-ajax-loading = "#UpdateProgress" data-ajax-success = "window.location='Course'" id = "form0" method = "post" >

</form>

 

由於課程編號不允許修改,範例利用Html.HiddenFor方法產生隱藏的欄位來儲存。此行程式:

@Html.HiddenFor( model => model.ID )

將產生以下的標籤,設定type為「hidden」:

<input data-val = "true" data-val-number = "欄位 ID 必須是數字。" data-val-required = "ID 欄位是必要項。" id = "ID" name = "ID" type = "hidden" value = "1">

我們利用Html.LabelFor方法產生提示文字,此行程式:

@Html.LabelFor( model => model.Name )

將產生以下的標籤:

<label for = "Name"> Name </label>

我們利用Html. EditorFor方法產生文字方塊,此行程式:

@Html.EditorFor( model => model.Name )

將產生以下的標籤:

<input class = "text-box single-line" data-val = "true" data-val-required = "不可為空白" id = "Name" name = "Name" type = "text" value = "ASP.NET MVC">

由於資料模型中課程天數是數值型別,所以此行程式:

@Html.EditorFor( model => model.Length )

將產生以下的標籤,type設定為number,此為HTML5標籤,顯示在Chrome瀏覽器時,會以包含上下箭頭的文字方塊來呈現:

<input class = "text-box single-line" data-val = "true" data-val-number = "欄位 Length 必須是數字。" id = "Length" name = "Length" type = "number" value = "5">
 

測試與執行

在Visual Studio 2012中,按F5鍵來執行程式,在瀏覽器上輸入以下URL(請將埠號代換成實際的埠號):

http://localhost:埠號/

執行的結果如下圖所示,當你點選「Edit」連結時,便透過AJAX取得課程明細,顯示在下方供編輯:

clip_image015

圖 10:編輯課程資料。

當你按下畫面上的「存檔」按鈕,資料會馬上寫回伺服端,畫面中的課程清單資料也隨之更新。

Tags:

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

評論 (51) -

ssam
ssam Taiwan
2013/12/3 上午 10:57:07 #

建立的部分檢視,點選後還是會跑到獨立頁面,請問可能是什麼原因?

回覆

USIO
USIO Taiwan
2014/7/25 下午 02:53:46 #

我之前也有跟你一樣的問題
後來載入Script就會顯示在同一個頁面了!
跟勾選"建立成部分檢視"沒有關係

回覆

jerry
jerry Taiwan
2014/8/1 下午 04:24:43 #

照上述程式設定我也有一樣的問題 , 點選edit或detail 會跑到獨立頁面
是否哪裡設定錯誤?

回覆

Vivid
Vivid Taiwan
2014/8/19 下午 04:55:05 #

我又試了一次,沒有這樣的問題。注意你的網頁是否引用jquery.unobtrusive-ajax.min.js檔案。
不過發現一個問題,使用的CSS語法,在IE11中版面會不正常。Chrome和Firefox則正常。
重測時,使用View程式如下:

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>

  <link href="~/Content/Site.css" rel="stylesheet" />
</head>
<body>
  <h2> Index </h2>
  <h2> 課程清單 </h2>
  @foreach ( var item in Model.Items ) {
    <div class="Parent">
      <div class="Child1">
        @Html.DisplayFor( modelItem => item.ID )
      </div>
      <div class="Child2">
        @Html.DisplayFor( modelItem => item.Name )
      </div>
      <div class="Child3">
        @Html.DisplayFor( modelItem => item.Description )
      </div>
      <div class="Child4">
        @Html.DisplayFor( modelItem => item.Length )
      </div>
      <div class="Child5">
        @Ajax.ActionLink( "Edit" ,
                    "Edit" , "Course" , new { id = item.ID } ,
                    new AjaxOptions {
                      UpdateTargetId = "CourseDetails" ,
                      InsertionMode = InsertionMode.Replace ,
                      HttpMethod = "GET"
                    } )
        |
        @Ajax.ActionLink( "明細" ,
                    "Details" , "Course" , new { id = item.ID } ,
                    new AjaxOptions {
                      UpdateTargetId = "CourseDetails" ,
                      InsertionMode = InsertionMode.Replace ,
                      HttpMethod = "GET"
                    } )
      </div>
    </div>
  }
  <div id="CourseDetails">
  </div>
  <script src="~/Scripts/jquery-1.8.2.min.js"></script>
  <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

</body>
</html>

回覆

cours de theatre paris
cours de theatre paris United States
2017/9/30 上午 07:44:16 #

Awesome blog post.Much thanks again. Really Cool.

回覆

can ho vung tau
can ho vung tau United States
2017/10/7 上午 12:42:47 #

This is one awesome blog post.Really thank you!

回覆

can ho bien vung tau
can ho bien vung tau United States
2017/10/9 下午 06:31:24 #

I think this is a real great blog post. Fantastic.

回覆

Google cheat 2017
Google cheat 2017 United States
2017/10/12 下午 09:10:17 #

Say, you got a nice blog article.Thanks Again. Cool.

回覆

click for source
click for source United States
2017/10/14 下午 04:26:12 #

I cannot thank you enough for the article.Really thank you! Cool.

回覆

dragon city hack apk download
dragon city hack apk download United States
2017/10/15 下午 03:55:24 #

Really enjoyed this blog article. Cool.

回覆

try this out
try this out United States
2017/10/17 下午 03:13:21 #

Im obliged for the article.Thanks Again. Keep writing.

回覆

VigRx
VigRx United States
2017/10/19 上午 07:49:47 #

Very neat post.Thanks Again. Will read on...

回覆

read full info
read full info United States
2017/10/19 下午 06:46:45 #

Thanks so much for the blog article.Really thank you! Want more.

回覆

Osimi SeaView
Osimi SeaView United States
2017/10/21 上午 04:02:46 #

Great blog.Really looking forward to read more. Really Great.

回覆

carte grise en ligne
carte grise en ligne United States
2017/10/21 上午 07:40:49 #

Great, thanks for sharing this blog post.Thanks Again. Really Cool.

回覆

website designing company in Delhi India
website designing company in Delhi India United States
2017/10/24 下午 02:44:45 #

Thanks for sharing, this is a fantastic post.

回覆

EZ Battery Reconditioning Scam
EZ Battery Reconditioning Scam United States
2017/10/30 上午 11:05:50 #

Really appreciate you sharing this blog article.Really looking forward to read more. Fantastic.

回覆

plock wiadomosci
plock wiadomosci United States
2017/10/30 下午 06:51:41 #

This is one awesome post.Thanks Again. Want more.

回覆

life leadership
life leadership United States
2017/11/1 上午 11:20:00 #

Wow, great blog post.Much thanks again. Great.

回覆

phenocal review
phenocal review United States
2017/11/1 下午 06:48:54 #

I appreciate you sharing this blog post.Much thanks again. Really Cool.

回覆

phentaslim review
phentaslim review United States
2017/11/3 下午 02:37:32 #

Thanks so much for the blog article.Thanks Again. Want more.

回覆

Muchos Gracias for your blog post.Really looking forward to read more. Fantastic.

回覆

sciatica pain ebook
sciatica pain ebook United States
2017/11/15 上午 06:44:25 #

I really liked your post.Really looking forward to read more. Want more.

回覆

avocat criminel quebec
avocat criminel quebec United States
2017/11/16 下午 05:19:36 #

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

回覆

Very informative article post.Really thank you! Fantastic.

回覆

what is google translator toolkit
what is google translator toolkit United States
2017/11/22 上午 01:51:55 #

Thank you for your article post. Great.

回覆

swimwear
swimwear United States
2017/11/23 下午 08:45:21 #

I appreciate you sharing this article.Really thank you! Much obliged.

回覆

It Company In Auckland
It Company In Auckland United States
2017/11/25 下午 05:44:32 #

Thanks for the blog.Much thanks again. Want more.

回覆

Chad Boonswang SEO
Chad Boonswang SEO United States
2017/11/26 下午 10:55:34 #

I value the blog article.Really looking forward to read more. Much obliged.

回覆

car wrecker scammer
car wrecker scammer United States
2017/11/29 下午 03:19:38 #

Say, you got a nice article.Thanks Again. Keep writing.

回覆

The Avila 2
The Avila 2 United States
2017/11/29 下午 09:53:15 #

Im obliged for the blog article.Much thanks again. Really Great.

回覆

ICO
ICO United States
2017/11/30 下午 11:45:53 #

Very neat blog. Awesome.

回覆

porno
porno United States
2017/12/1 下午 03:25:47 #

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

回覆

Get Business Credit
Get Business Credit United States
2017/12/3 上午 03:44:27 #

I think this is a real great article post.Thanks Again. Really Cool.

回覆

Very neat blog article.Really thank you! Awesome.

回覆

Thanks for the post.Really looking forward to read more. Awesome.

回覆

michel law
michel law United States
2017/12/10 下午 06:09:49 #

I really enjoy the blog.Thanks Again. Will read on...

回覆

Genia Botticello
Genia Botticello United States
2017/12/14 上午 08:16:56 #

Im grateful for the post.Much thanks again. Awesome.

回覆

my review here
my review here United States
2017/12/14 下午 03:07:42 #

I think this is a real great blog article.Much thanks again. Fantastic.

回覆

Christmas
Christmas United States
2017/12/14 下午 09:38:02 #

Really informative blog.Really thank you! Great.

回覆

canon driver software
canon driver software United States
2017/12/16 下午 04:50:49 #

Thanks for sharing, this is a fantastic blog article. Cool.

回覆

tips lose weight
tips lose weight United States
2017/12/16 下午 11:05:45 #

Enjoyed every bit of your blog article.Much thanks again.

回覆

Very good article.Really thank you! Will read on...

回覆

Operations
Operations United States
2017/12/17 下午 04:32:59 #

Awesome blog post. Really Cool.

回覆

fake degrees with verification
fake degrees with verification United States
2017/12/17 下午 11:34:00 #

Hey, thanks for the post. Keep writing.

回覆

home jobs
home jobs United States
2017/12/20 下午 05:43:21 #

Thanks again for the article.Much thanks again. Great.

回覆

canon drivers
canon drivers United States
2017/12/23 上午 08:55:07 #

Really enjoyed this post. Really Great.

回覆

Darwin Horan
Darwin Horan United States
2017/12/23 下午 07:22:42 #

I am so grateful for your article. Really Great.

回覆

hp driver
hp driver United States
2017/12/25 下午 08:52:44 #

I value the blog.Really thank you! Keep writing.

回覆

Major thanks for the blog.Really thank you! Really Great.

回覆

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

回覆

新增評論




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






NET Magazine國際中文電子雜誌

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

月分類Month List