了解ASP.NET 4 MVC 的Model Binder與Action Filter

by Vivid 22. 三月 2011 09:01

ASP.NET MVC 架構提供一個Model Binding的功能,可以很簡單地自動將URL參數值對應到Action method的參數。預設ASP.NET MVC 收到HTTP請求 (HTTP Request)後,就會檢視其中的資料,看看包含的資料中是否有和Action method接收的參數名稱相同,若有相同的名稱,則請求中包含的值會直接傳到Action method。簡單地說,DefaultModelBinder可以將URL或Form的值轉換之後,將資料包裝成物件。本文將介紹ASP.NET 4 MVC Model Binder與Action Filter基本的觀念。

ASP.NET提供以下預設的Model Binder負責將瀏覽器送出的請求對應到一個物件:

  • 預設的Model Binder:DefaultModelBinder利用名稱,將Entity 中每一個宣告為public的屬性對應到Entity。
  • FormCollection Model Binder。
  • HttpPostedFileBase。

預設的Model Binder可以自動根據瀏覽器送至的請求,建立以下型別:

  • 內建型別:如 int、String、DateTime。
  • 自訂類別。
  • 陣列或集合。

如果上述的Model Binder不敷使用,您也可以客製化自訂之。

我們來看幾個範例,以了解該如何使用Model Binder,例如Model中包含一個Book類別:

   1:  namespace MvcModelBinder.Models {
   2:  public class Book
   3:  {
   4:  public string ID { get; set; }
   5:  public string Title { get; set; }
   6:  public decimal Price { get; set; }
   7:  }
   8:  }
有一個BookController包含如下程式碼:

   1:  public class BookController : Controller
   2:   
   3:  {
   4:   
   5:  public ActionResult Create()
   6:   
   7:  {
   8:   
   9:  return View();
  10:   
  11:  }
  12:   
  13:  [HttpPost]
  14:   
  15:  public ActionResult Create(Book newBook)
  16:   
  17:  {
  18:   
  19:  return RedirectToAction("Index");
  20:   
  21:  }
  22:   
  23:  }
  24:   
Create Action有兩個,第二個Create Action方法上方標示「HttpPost」並接收一個Book型別參數,在這個例子中,當接收到HTTP POST請求時,將會使用預設的Binder負責建立Book物件的實體,並且將HTML Form表單欄位的值指定給Book物件的屬性。

在Create View中利用HTML Helpers建立以下HTML與程式碼:

<%@ Page Title = "" Language = "C#" MasterPageFile = "~/Views/Shared/Site.Master" Inherits = "System.Web.Mvc.ViewPage<MvcModelBinder.Models.Book>" %>   
    
    <asp:Content ID = "Content1" ContentPlaceHolderID = "TitleContent" runat = "server">   
    
    Create   
        
    </asp:Content>   
        
    <asp:Content ID = "Content2" ContentPlaceHolderID = "MainContent" runat = "server">  
       
    <h2>Create</h2>  
       
    <% using ( Html.BeginForm() ) {%>  
       
    <fieldset>  
       
    <legend> Fields </legend>  
       
    <div class = "editor-label" >  
       
    <% = Html.LabelFor( model => model.ID ) %>  
       
    </div>  
       
    <div class = "editor-field" >  
       
    <%= Html.TextBoxFor (model => model.ID ) %>  
       
    <%= Html.ValidationMessageFor( model => model.ID ) %>  
       
    </div>  
       
    <div class = "editor-label" >  
      
    <%= Html.LabelFor( model => model.Title ) %>  
       
    </div>  
       
    <div class = "editor-field">  
       
    <%= Html.TextBoxFor( model => model.Title ) %>  
       
    <%= Html.ValidationMessageFor( model => model.Title ) %>  
       
    </div>  
       
    <div class = "editor-label">  
       
    <%= Html.LabelFor( model => model.Price ) %>  
       
    </div>  
       
    <div class = "editor-field">  
       
    <%= Html.TextBoxFor( model => model.Price ) %>  
       
    <%= Html.ValidationMessageFor( model => model.Price ) %>  
       
    </div>  
       
    <p>  
       
    <input type = "submit" value = "Create" />  
       
    </p>  
       
    </fieldset>  
       
    <% } %>  
       
    <div>  
       
    <%= Html.ActionLink( "Back to List", "Index") %>  
       
    </div>  
      
    </asp:Content>

 由於在Page指示詞利用Inherits 傳入System.Web.Mvc.ViewPage<MvcModelBinder.Models.Book>型別,Model屬性就代表了Book。這個View執行的結果如圖1所示:

clip_image004

圖 1:使用Model Binder傳遞Form

當你在Create View中輸入資料提交到伺服器,實際上是將表單送到BookController的Create Action。ASP.NET MVC就會把Form中包含的值適當轉換,包成Book物件傳入Create Action方法。

再如以下RetailController範例,其Create Action接收一個string型別的陣列:

   1:  using System.Web.Mvc;
   2:   
   3:  namespace MvcModelBinder.Controllers{
   4:   
   5:  public class RetailController : Controller {
   6:   
   7:  public ActionResult Create () {
   8:   
   9:  return View();
  10:   
  11:  } 
  12:   
  13:  [HttpPost]
  14:   
  15:  public ActionResult Create( string [ ] data)
  16:   
  17:  {
  18:   
  19:  return View();
  20:   
  21:  }
  22:   
  23:  }
  24:   
  25:  }
  26:   
Create View中包含以下標籤:

<% @ Page Title = "" Language = "C#" MasterPageFile = "~/Views/Shared/Site.Master" Inherits = "System.Web.Mvc.ViewPage" %>

<asp:Content ID = "Content1" ContentPlaceHolderID = "TitleContent" runat = "server">

Create

</asp:Content>

<asp:Content ID = "Content2" ContentPlaceHolderID = "MainContent" runat = "server">

<h2> Create </h2>

<% using ( Html.BeginForm() ) { %>

選擇銷售的商店名稱 <br />

<input name = "data" type = "checkbox" value = "商店A" />商店A <br />

<input name = "data" type = "checkbox" value = "商店B" />商店B<br />

<input name = "data" type = "checkbox" value = "商店C" />商店C<br />

<input name = "data" type = "checkbox" value = "商店D" />商店D<br />

<input type = "submit" value = "Create" />

<% } % >

</asp:Content>
預設的Binder會自動將HTML Form中Input 的value取出,包裝成字串陣列,送到Controller的Action方法,View的執行結果參考圖2所示。

clip_image006

圖 2:使用Model Binder轉換字串陣列

複雜類別的繫結

ASP.NET MVC架構針對一些複雜的型別也提供預設的繫結能力,例如以下Model包含一個Book類別,Book類別中有一個BookAuthor屬性,其型別是一個Author類別。

   1:  namespace MvcModelBinder.Models
   2:   
   3:  {
   4:   
   5:  public class Book
   6:   
   7:  {
   8:   
   9:  public string ID { get; set; }
  10:   
  11:  public string Title { get; set; }
  12:   
  13:  public decimal Price { get; set; }
  14:   
  15:  public Author BookAuthor { get; set; }
  16:   
  17:  }
  18:   
  19:  public class Author
  20:   
  21:  {
  22:   
  23:  public string Name { get; set; }
  24:   
  25:  public string PhoneNumber { get; set; }
  26:   
  27:  }
  28:   
  29:  }

設計Create View時,View的部分在設定時,可以利用BookAuthor屬性來取得Name與PhoneNumber:

   1:  <%@ Page Title = "" Language = "C#" MasterPageFile = "~/Views/Shared/Site.Master" Inherits = "System.Web.Mvc.ViewPage<MvcModelBinder.Models.Book> " % >
   2:   
   3:  <asp:Content ID = "Content1" ContentPlaceHolderID = "TitleContent" runat = "server"> Create </asp:Content>
   4:   
   5:  <asp:Content ID = "Content2" ContentPlaceHolderID = "MainContent" runat = "server">
   6:   
   7:  <h2> Create </h2>
   8:   
   9:  <% using ( Html.BeginForm() ) {%>
  10:   
  11:  <fieldset>
  12:   
  13:  <legend> 圖書資料 </legend>
  14:   
  15:  <div class = "editor-label">
  16:   
  17:  <%= Html.LabelFor( model => model.ID ) %>
  18:   
  19:  </div>
  20:   
  21:  <div class = "editor-field">
  22:   
  23:  <%= Html.TextBoxFor( model => model.ID ) %>
  24:   
  25:  <%= Html.ValidationMessageFor( model => model.ID ) %>
  26:   
  27:  </div>
  28:   
  29:  <div class="editor-label">
  30:   
  31:  <%= Html.LabelFor(model => model.Title) %>
  32:   
  33:  </div>
  34:   
  35:  <div class="editor-field">
  36:   
  37:  <%= Html.TextBoxFor(model => model.Title) %>
  38:   
  39:  <%= Html.ValidationMessageFor(model => model.Title) %>
  40:   
  41:  </div>
  42:   
  43:  <div class="editor-label">
  44:   
  45:  <%= Html.LabelFor(model => model.Price) %>
  46:   
  47:  </div>
  48:   
  49:  <div class="editor-field">
  50:   
  51:  <%= Html.TextBoxFor(model => model.Price) %>
  52:   
  53:  <%= Html.ValidationMessageFor(model => model.Price) %>
  54:   
  55:  </div>
  56:   
  57:  </fieldset>
  58:   
  59:  <fieldset>
  60:   
  61:  <legend> 作者資料 </legend>
  62:   
  63:  <div class = "editor-label" >
  64:   
  65:  <%= Html.LabelFor( model => model.BookAuthor.Name ) %>
  66:   
  67:  </div>
  68:   
  69:  <div class="editor-field">
  70:   
  71:  <%= Html.TextBoxFor( model => model.BookAuthor.Name )%>
  72:   
  73:  <%= Html.ValidationMessageFor( model => model.BookAuthor.Name )%>
  74:   
  75:  </div>
  76:   
  77:  <div class = "editor-label" >
  78:   
  79:  <%= Html.LabelFor(model => model.BookAuthor.PhoneNumber)%>
  80:   
  81:  </div>
  82:   
  83:  <div class ="editor-field">
  84:   
  85:  <%= Html.TextBoxFor( model => model.BookAuthor.PhoneNumbe r)%>
  86:   
  87:  <%= Html.ValidationMessageFor( model => model.BookAuthor.PhoneNumber )%>
  88:   
  89:  </div>
  90:   
  91:  </fieldset>
  92:   
  93:  <p>
  94:   
  95:  <input type = "submit" value = "Create" />
  96:   
  97:  </p>
  98:   
  99:  <% } % >
 100:   
 101:  <div>
 102:   
 103:  <%= Html.ActionLink( "Back to List", "Index" ) %>
 104:   
 105:  </div>
 106:   
 107:  </asp:Content>
 108:   

使用Bind Attribute控制繫結

您可以進一步利用System.Web.Mvc命名空間下的Bind Attribute來控制Model Binder建立物件的行為,常用的Bind Attribute包含如下:

  • Exclude:將屬性排除不繫結。可以使用逗號區格多個屬性。
  • Include:加入屬性,可以使用逗號區格多個屬性。

例如以上例Book類別而言,若Book的ID屬性值最終是由資料庫自動編號,那麼HTML Form中的HTML元素就不須和Book的ID屬性建立繫結關係,您可以修改BookController的Create action如下:

   1:  [HttpPost]
   2:   
   3:  public ActionResult Create( [Bind( Exclude="ID") ] Book newBook) {
   4:   
   5:  return RedirectToAction( "Index" );
   6:   
   7:  }

如此newBook的ID便會是null值。另一種作法是在類別的上方套用此Attribute,例如修改Model,會得到同樣的效果:

   1:  [Bind( Exclude = "ID" )]
   2:   
   3:  public class Book
   4:   
   5:  { //略 }
   6:   
使用FormCollection Model Binder

您也可以使用FormCollection Model Binder將Form中項目的集合直接進行繫結,例如Model中包含Book2類別:

   1:  public class Book2
   2:   
   3:  {
   4:   
   5:  public string ID { get; set; }
   6:   
   7:  public string Title { get; set; }
   8:   
   9:  public decimal Price { get; set; }
  10:   
  11:  }
  12:   
Controller中包含一個Create方法,傳入FormCollection參數,並且利用Controller的UpdateModel方法,將Form欄位繫結到Book2的實體。UpdateModel方法傳入的參數便是Book2的實體。

   1:  using System.Web.Mvc;
   2:   
   3:  using MvcModelBinder.Models;
   4:   
   5:  namespace MvcModelBinder.Controllers
   6:   
   7:  {
   8:   
   9:  public class Book2Controller : Controller {
  10:   
  11:  public ActionResult Create () {
  12:   
  13:  return View();
  14:   
  15:  } 
  16:   
  17:  [HttpPost]
  18:   
  19:  public ActionResult Create( FormCollection collection )
  20:   
  21:  {
  22:   
  23:  var aBook = new Book2 ();
  24:   
  25:  this.UpdateModel( aBook );
  26:   
  27:  return RedirectToAction( "Index" );
  28:   
  29:  }
  30:   
  31:  }
  32:   
  33:  }
  34:   

若不想要將Form所有的欄位繫結到Model屬性,您可以在UpdateModel的第二個參數傳入為要繫結的屬性名稱所成的陣列,例如將上述Update那行程式碼修改為:

this.UpdateModel( aBook, new string [] { "ID","Title","Price" } );

則只會繫結ID、Title與Price屬性。

底下Create View的程式碼用來顯示繫結的結果。

   1:  <%@ Page Title = "" Language = "C#" MasterPageFile = "~/Views/Shared/Site.Master" Inherits = "System.Web.Mvc.ViewPage<MvcModelBinder.Models.Book2> " %>
   2:   
   3:  <asp:Content ID = "Content1" ContentPlaceHolderID = "TitleContent" runat = "server" >
   4:   
   5:  Create
   6:   
   7:  </asp:Content>
   8:   
   9:  <asp:Content ID = "Content2" ContentPlaceHolderID = "MainContent" runat = "server">
  10:   
  11:  <h2> Create </h2>
  12:   
  13:  <% using ( Html.BeginForm() ) {%>
  14:   
  15:  <fieldset>
  16:   
  17:  <legend> Fields </legend>
  18:   
  19:  <div class = "editor-label" >
  20:   
  21:  <%= Html.LabelFor( model => model.ID ) %>
  22:   
  23:  </div>
  24:   
  25:  <div class = "editor-field">
  26:   
  27:  <%= Html.TextBoxFor( model => model.ID ) %>
  28:   
  29:  <%= Html.ValidationMessageFor( model => model.ID ) %>
  30:   
  31:  </div>
  32:   
  33:  <div class = "editor-label">
  34:   
  35:  <%= Html.LabelFor( model => model.Title ) %>
  36:   
  37:  </div>
  38:   
  39:  <div class = "editor-field">
  40:   
  41:  <%= Html.TextBoxFor( model => model.Title ) %>
  42:   
  43:  <%= Html.ValidationMessageFor( model => model.Title ) %>
  44:   
  45:  </div>
  46:   
  47:  <div class = "editor-label" >
  48:   
  49:  <%= Html.LabelFor( model => model.Price ) %>
  50:   
  51:  </div>
  52:   
  53:  <div class = "editor-field">
  54:   
  55:  <%= Html.TextBoxFor( model => model.Price ) %>
  56:   
  57:  <%= Html.ValidationMessageFor( model => model.Price ) %>
  58:   
  59:  </div>
  60:   
  61:  <p>
  62:   
  63:  <input type ="submit" value = "Create" />
  64:   
  65:  </p>
  66:   
  67:  </fieldset>
  68:   
  69:  <% } % >
  70:   
  71:  <div>
  72:   
  73:  <%= Html.ActionLink( "Back to List", "Index") %>
  74:   
  75:  </div>
  76:   
  77:  </asp:Content>
  78:   

使用HttpPostedFileBase Model Binder

若要在ASP.NET MVC架構下設計檔案上傳的功能,您可以使用HttpPostedFileBase Model Binder,可以將檔案上傳到Controller的Action。例如Controller如下,利用HttpPostedFileBase類別的SaveAs方法將收到的檔案儲存在伺服器Uploads目錄下:

   1:  using System.Web.Mvc;
   2:   
   3:  namespace MvcModelBinder.Controllers
   4:   
   5:  {
   6:   
   7:  public class UploadController : Controller
   8:   
   9:  {
  10:   
  11:  public ActionResult Index ()
  12:   
  13:  {
  14:   
  15:  return View ();
  16:   
  17:  }
  18:   
  19:  public ActionResult UploadData ()
  20:   
  21:  {
  22:   
  23:  return View ();
  24:   
  25:  } 
  26:   
  27:  [HttpPost]
  28:   
  29:  public ActionResult UploadData( HttpPostedFileBase upload )
  30:   
  31:  {
  32:   
  33:  var f = System.IO.Path.GetFileName( upload.FileName );
  34:   
  35:  upload.SaveAs( Server.MapPath( "~/Uploads/" + f ) );
  36:   
  37:  return RedirectToAction( "Index" );
  38:   
  39:  }
  40:   
  41:  }
  42:   
  43:  }
  44:   
我們利用以下的UploadData View來上傳檔案:

   1:  <%@ Page Title = "" Language = "C#" MasterPageFile = "~/Views/Shared/Site.Master" Inherits = "System.Web.Mvc.ViewPage" %>
   2:   
   3:  <asp:Content ID = "Content1" ContentPlaceHolderID = "TitleContent" runat = "server">
   4:   
   5:  UploadData
   6:   
   7:  </asp:Content>
   8:   
   9:  <asp:Content ID = "Content2" ContentPlaceHolderID = "MainContent" runat = "server">
  10:   
  11:  <h2> 檔案上傳 </h2>
  12:   
  13:  <form method = "post" enctype = "multipart/form-data" action = '<%= Url.Action("UploadData") %>'>
  14:   
  15:  <input name = "upload" type = "file" />
  16:   
  17:  <input type = "submit" value = "上傳檔案" />
  18:   
  19:  </form>
  20:   
  21:  </asp:Content>
  22:   

當執行時,參考圖3所示,您可以按「Browse」按鈕選取檔案後,再按下「上傳檔案」的按鈕上傳。

clip_image008

圖 3:檔案上傳。

使用Action Filter

Action Filter可以在Controller的Action執行之前、或之後,以及Action Result執行之前、之後,來進行前置動作或後置處理,例如內建有用進行授權、或錯誤處理、輸出快取的Filter。實際上Action Filter就是一個Attribute,您可以在Controller類別,或Action等級來套用它們。

例如以下建立一個LogAttribute類別,繼承自ActionFilterAttribute類別,並改寫其OnActionExecuting、OnActionExecuted、OnResultExecuted與OnResultExecuting方法,每當ActionExecuting、ActionExecuted、ResultExecuted與ResultExecuting事件發生時,便將Controller、Action與自訂的訊息寫入作業系統日誌中:

   1:  using System.Web.Mvc;
   2:   
   3:  using System.Web.Routing;
   4:   
   5:  using System.Diagnostics;
   6:   
   7:  namespace MvcModelBinder.CustomActionFilter
   8:   
   9:  {
  10:   
  11:  public class LogAttribute : ActionFilterAttribute
  12:   
  13:  {
  14:   
  15:  public override void OnActionExecuting( ActionExecutingContext filterContext )
  16:   
  17:  {
  18:   
  19:  base.OnActionExecuting( filterContext );
  20:   
  21:  WriteToLog( filterContext.RouteData, "OnActionExecuting" );
  22:   
  23:  }
  24:   
  25:  public override void OnActionExecuted( ActionExecutedContext filterContext )
  26:   
  27:  {
  28:   
  29:  base.OnActionExecuted( filterContext );
  30:   
  31:  WriteToLog( filterContext.RouteData, "OnActionExecuted" );
  32:   
  33:  }
  34:   
  35:  public override void OnResultExecuted( ResultExecutedContext filterContext )
  36:   
  37:  {
  38:   
  39:  base.OnResultExecuted( filterContext );
  40:   
  41:  WriteToLog( filterContext.RouteData, "OnResultExecuted" );
  42:   
  43:  }
  44:   
  45:  public override void OnResultExecuting( ResultExecutingContext filterContext )
  46:   
  47:  {
  48:   
  49:  base.OnResultExecuting( filterContext );
  50:   
  51:  WriteToLog( filterContext.RouteData, "OnResultExecuting" );
  52:   
  53:  }
  54:   
  55:  void WriteToLog(RouteData routeData,string msg)
  56:   
  57:  {
  58:   
  59:  string s = string.Format( "{0}:{1}:{2}" , routeData.Values["controller"].ToString() ,
  60:   
  61:  routeData.Values["action"].ToString() , msg);
  62:   
  63:  EventLog.WriteEntry( "Application", s );
  64:   
  65:  }
  66:   
  67:  }
  68:   
  69:  }
  70:   
後續便可以在任一Controller類別上方直接套用LogAttribute,語法如下:

   1:  [Log]
   2:   
   3:  public class BookController : Controller
   4:   
   5:  {
   6:   
   7:  }
   8:   
檢視日誌,參考執行的結果如圖4所示:

clip_image010

圖 4:日誌。

總結

ASP.NET MVC架構可以自動將URL參數值對應到Action method的參數。Model Binder提供簡單的方式讓你將Form表單的值對應到.NET型別,並將型別傳入Action Method的參數。Model Binder也可以用來控制這些參數的序列化。若預設的Binder還不夠使用,您還可以自訂Binder來擴充它的功能。只要實作IModelBinder介面的BindModel方法就可以達到這個需求。

ModelState包含Model Binding的狀態資訊,其Errors屬性是一個ModelErrorCollection物件,包含繫結過程中發生的錯誤。Value屬性則包含要繫結的值。您可以利用IsValid屬性來判斷繫結的動作是否成功。

Tags:

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

評論 (63) -

cours de theatre paris
cours de theatre paris United States
2017/9/30 上午 10:26:04 #

Muchos Gracias for your blog.Thanks Again. Really Great.

回覆

can ho vung tau
can ho vung tau United States
2017/10/6 下午 11:17:30 #

I really liked your article.Much thanks again. Awesome.

回覆

Google cheat 2017
Google cheat 2017 United States
2017/10/9 下午 01:12:45 #

Thank you ever so for you article.Really thank you! Cool.

回覆

tania kamagra
tania kamagra United States
2017/10/9 下午 02:50:36 #

Im obliged for the post.Much thanks again. Great.

回覆

Osimi seaview
Osimi seaview United States
2017/10/9 下午 05:07:14 #

Looking forward to reading more. Great article. Awesome.

回覆

solarmovie
solarmovie United States
2017/10/10 下午 06:55:51 #

Enjoyed every bit of your article.Thanks Again. Much obliged.

回覆

Sterling Businesses Ltd
Sterling Businesses Ltd United States
2017/10/10 下午 09:02:16 #

Thanks so much for the blog article. Want more.

回覆

pirater un compte facebook
pirater un compte facebook United States
2017/10/10 下午 11:21:02 #

Wow, great blog article.Really looking forward to read more. Great.

回覆

buy hacklink google
buy hacklink google United States
2017/10/12 下午 07:45:46 #

Fantastic article post. Really Great.

回覆

company website
company website United States
2017/10/14 下午 02:25:50 #

I am so grateful for your post.Really thank you! Keep writing.

回覆

dragon city hack unlimited gems apk
dragon city hack unlimited gems apk United States
2017/10/15 下午 02:27:40 #

Thanks for the article post.Much thanks again. Fantastic.

回覆

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

Thanks-a-mundo for the blog.Really thank you! Awesome.

回覆

Continue Reading
Continue Reading United States
2017/10/17 下午 01:45:18 #

Really informative article post.Really thank you! Will read on...

回覆

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

Thanks a lot for the article.Really looking forward to read more. Really Great.

回覆

The Avila 2
The Avila 2 United States
2017/10/19 上午 04:40:20 #

Wow, great article post.Much thanks again. Really Cool.

回覆

pure slim 1000 review
pure slim 1000 review United States
2017/10/20 上午 02:39:26 #

Great, thanks for sharing this post. Much obliged.

回覆

Osimi Sea View
Osimi Sea View United States
2017/10/21 上午 02:20:12 #

I think this is a real great blog post.Really looking forward to read more.

回覆

carte grise en ligne
carte grise en ligne United States
2017/10/21 上午 05:59:23 #

Fantastic blog post.Really looking forward to read more. Cool.

回覆

elake
elake United States
2017/10/21 下午 04:24:05 #

I appreciate you sharing this blog article.Really thank you! Will read on...

回覆

Turbotax customer service
Turbotax customer service United States
2017/10/24 上午 08:41:16 #

wow, awesome blog post.Much thanks again. Will read on...

回覆

du an osimi
du an osimi United States
2017/10/28 上午 08:54:03 #

I value the post.Really looking forward to read more. Really Great.

回覆

EZ Battery Reconditioning
EZ Battery Reconditioning United States
2017/10/30 上午 07:47:08 #

Muchos Gracias for your article post. Keep writing.

回覆

lepszy plock
lepszy plock United States
2017/10/30 下午 03:33:00 #

Im thankful for the article post. Really Great.

回覆

life leadership
life leadership United States
2017/11/1 上午 08:01:16 #

I really liked your article post.Really thank you! Really Cool.

回覆

phenocal
phenocal United States
2017/11/1 下午 03:24:29 #

Really enjoyed this article post.Thanks Again.

回覆

phentaslim
phentaslim United States
2017/11/3 上午 11:05:27 #

wow, awesome post. Want more.

回覆

This is one awesome post.Really thank you! Really Cool.

回覆

spinal stenosis holistic treatment
spinal stenosis holistic treatment United States
2017/11/15 上午 08:20:10 #

Awesome post.Really looking forward to read more.

回覆

avocat criminel
avocat criminel United States
2017/11/16 下午 06:55:18 #

Thanks for sharing, this is a fantastic blog post.Much thanks again. Fantastic.

回覆

computer low on virtual memory
computer low on virtual memory United States
2017/11/22 上午 03:36:41 #

I think this is a real great blog.Much thanks again. Keep writing.

回覆

fashion
fashion United States
2017/11/23 下午 10:24:40 #

I really liked your post. Really Cool.

回覆

Auckland Seo Company
Auckland Seo Company United States
2017/11/25 下午 07:21:51 #

Fantastic article.Thanks Again. Great.

回覆

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

Thanks-a-mundo for the post.Really looking forward to read more. Will read on...

回覆

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

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

回覆

scammer wreckers
scammer wreckers United States
2017/11/29 下午 05:00:05 #

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

回覆

Osimi Tower
Osimi Tower United States
2017/11/29 下午 11:37:24 #

Thanks for the article post. Keep writing.

回覆

business trade lines
business trade lines United States
2017/12/1 上午 01:24:56 #

I really enjoy the blog article.Really looking forward to read more. Really Cool.

回覆

Initial coin offering
Initial coin offering United States
2017/12/3 上午 05:23:04 #

Im thankful for the blog post.Really looking forward to read more. Awesome.

回覆

mika tan
mika tan United States
2017/12/5 上午 10:10:27 #

I really enjoy the article post. Really Great.

回覆

Muchos Gracias for your article post.Much thanks again. Awesome.

回覆

lawyers site
lawyers site United States
2017/12/10 下午 07:46:54 #

I loved your blog.Thanks Again.

回覆

Forrest Barreiro
Forrest Barreiro United States
2017/12/14 上午 09:54:00 #

A big thank you for your blog.Thanks Again. Keep writing.

回覆

click here to investigate
click here to investigate United States
2017/12/14 下午 04:46:18 #

I think this is a real great post.Thanks Again. Fantastic.

回覆

Christmas Songs
Christmas Songs United States
2017/12/14 下午 11:18:56 #

A round of applause for your article post.Really looking forward to read more. Keep writing.

回覆

canon drivers
canon drivers United States
2017/12/16 下午 06:27:33 #

Fantastic post.Really thank you! Keep writing.

回覆

Really appreciate you sharing this blog post.Thanks Again. Awesome.

回覆

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

回覆

PMO
PMO United States
2017/12/17 下午 06:07:24 #

I think this is a real great blog.Really looking forward to read more. Fantastic.

回覆

earn at home
earn at home United States
2017/12/20 下午 07:21:54 #

I really enjoy the blog article.Really looking forward to read more. Awesome.

回覆

canon drivers
canon drivers United States
2017/12/23 上午 11:26:10 #

Thanks so much for the post.Thanks Again. Cool.

回覆

hp driver
hp driver United States
2017/12/25 下午 11:23:09 #

Muchos Gracias for your article.Really looking forward to read more.

回覆

&#216;&#162;&#219;Œ&#217;†&#217;‡ &#216;&#168;&#216;&#186;&#217;„
آینه بغل United States
2017/12/26 上午 11:11:42 #

Hey, thanks for the blog.Really looking forward to read more. Will read on...

回覆

SOCCER HIGHLIGHTS
SOCCER HIGHLIGHTS United States
2017/12/26 下午 03:24:00 #

Muchos Gracias for your blog post.Thanks Again. Will read on...

回覆

canon drivers
canon drivers United States
2017/12/27 下午 10:08:20 #

Looking forward to reading more. Great article.Really looking forward to read more. Fantastic.

回覆

hp drivers
hp drivers United States
2018/1/2 下午 12:42:04 #

I appreciate you sharing this post.Really looking forward to read more. Cool.

回覆

visit this site right here
visit this site right here United States
2018/1/2 下午 08:50:27 #

A big thank you for your blog.

回覆

Epson drivers
Epson drivers United States
2018/1/3 下午 12:02:38 #

Thanks a lot for the blog.Much thanks again. Much obliged.

回覆

online casinos for real money usa
online casinos for real money usa United States
2018/1/4 下午 10:54:26 #

Very informative blog article. Really Great.

回覆

hp driver
hp driver United States
2018/1/5 下午 05:30:46 #

Appreciate you sharing, great article.Much thanks again. Great.

回覆

FBA
FBA United States
2018/1/6 上午 09:36:36 #

This is one awesome blog post.Much thanks again. Cool.

回覆

colocation chicago
colocation chicago United States
2018/1/10 上午 09:52:45 #

I value the article post.Really looking forward to read more.

回覆

新增評論




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






NET Magazine國際中文電子雜誌

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

月分類Month List