MVC

2009/Mar/21

 หลังจากออก  MVC  RC 1 Release Candidate  และ  MVC  RC 2 Release Candidate   ในที่สุด  Microsoft  ได้ออกตัว   ASP.NET MVC 1.0 Finally Released  ตัวเต็มๆออกมาแล้วครับ  ดูตัวเต็มแล้วไม่มีอะไรใหม่ไปจาก  MVC RC 2   มีการแก้ bug  และเปลี่ยน  version ของ  jquery  จาก  1.3.1  เป็น 1.3.2  (ถ้า  jquery เปลี่ยน  version จะออก  MVC  version อะไรล่ะทีนี้ )   
  นอกจากนี้ ยังมี ASP.NET MVC E-Book มาแจกกันฟรีๆ แต่แค่  185 หน้าเท่านั้นนะครับ อยากได้เล่มเต็มๆต้องเสียตังค์ :(

สังเกตได้ว่าเริ่มจะมีหนังสือเริ่มทยอยออกมาทันที หลังจาก MVC ออกตัวเต็มแล้ว  

 

โหลด Download (14 MB) 

2009/Mar/06

แป็บๆ  Microsoft  ออกตัว  RC2 ซะงั้น ดู new feature แล้วไม่ค่อยมีอะไรใหม่ในด้านของ Developement แล้ว สามารถเข้าไป  download  ได้ที่ Release Candidate 2 for ASP.NET MVC 

 การติดตั้ง
   -  ต้องการ .Net 3.5 SP1
   -  ถ้า  host ไม่ได้ลง 3.5  SP1  ทำตาม  link  นี้ 
      http://haacked.com/archive/2008/11/03/bin-deploy-aspnetmvc.aspx

   -  มีตัวที่ติดตั้งเฉพาะบน server โดยเฉพาะ  
      
     msiexec /i AspNetMvc-setup.msi /q /l*v .\mvc.log MVC_SERVER_INSTALL="YES"

 

2009/Feb/25

 - เพิ่ม templates  ของ  ViewPage , ViewMasterPage , ViewUserControls
    
   ดู การ  Inherits  ของ @ Master Directive  
 

 ViewUserControls 

<mvc:ViewType runat="server" TypeName="ViewUserControl">

เพิ่มคำสั่ง  "Add Controller"  ใน  Visual Studio



เพิ่มคำสั่ง  "Add View"  ใน  Visual Studio 2008   โดยการ Click  ขวา ใน action method ของ Controller หรือ ตรง View Folder  ใน  Solution Explorer  หรือ  กด  CTRL+M ,  CTRL+V  ภายในจะมี  features  คือ 



      1.  สามารถสร้าง   Viewpage  หรือ  ViewUserControl ( คลิ๊กเลือกที่  "Create a partial view (.ascx)")
      2.  มี  Option Strongly-typed  view
      3.  มี  Option View content  ได้แก่  List, Edit ,Create  และก็  Detail 
      4.  สามารถเลือก  master page  สำหรับแต่ล่ะ ViewPage

เพิ่มคำสั่ง  "Go to View"
เพิ่มคำสั่ง  "Go to Controller"
-  MVC File Refactoring 
      ถ้าหากเราต้องการ rename controller class   หรือ action method  
      Controller Class

    

     


      Action method

  

    

     เราสามารถใช้  Refactor > Rename.. เพื่อ Rename ชื่อ class และ  ส่วนที่เกี่ยวข้องทั้งหมดโดยอัตโนมัติ

   


โดยปกติแล้ว error  ที่อยู่ใน view จะไม่สามารถตรวจพบจนกระทั้งถึงตอน  runtime  ใน mvc rc สามารถกำหนดให้ error สามารถตรวจพบตอน compile time ได้โดย การเปิด  project file  และแก้ไข ในส่วนของ   ตาม code ด้านล่าง

<MvcBuildViews>trueMvcBuildViews>

ในบรรทัดสุดท้าย ของ project file  ให้ uncomment   เพิ่ม  code ดังนี้

<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)"></
Target>

- เพิ่ม " BeginRouteForm "  จะคล้ายๆกัล  Html.BeginForm ต่างตรงที่ สามารถกำหนด  route name ได้เปลี่ยนคำสั่งจาก  IsMvcAjaxRequest เป็น  IsAjaxRequest

เพิ่ม Jquery  Intellisense  file  ติดมาตอนสร้าง project ใหม่ (Project tempate)   เราสามารถดึงมาใช้เป็น  help  สำหรับมือใหม่  jquery

เปลี่ยนแปลง DropDownList  และ  ListMethod  ย้าน enumuration  จาก IEnumuration  เป็น IENumeration  ทำให้เราสามารถ Bind data  จาก LINQ  ไปเก็บ ใน  dropdownlist  ได้ เช่น

IEnumerable peopleList =    from person in db.People   
                                          
select new SelectListItem {
   
                                               
Text = (person.FirstName + " " + person.LastName),
                                      
        Value = person.SSN, 
                                           Selected = (person.SSN == selectedSSN)    }; 

มีตัว Helper สามารถ ป้องกัน CSRF Attacks 
        CSRF (Cross-Site request forgery)  หรือ  XSRF Attacks  มีสาเหตุมาจากการพิสุจน์ user ที่ใช้งานใน browser มีตัวตนและเข้าใช้งานเวบไซด์อย่างถูกต้อง ไม่ใช่การ  post ข้อมูลเข้ามา จากแหล่งเวบไซด์อื่น  หลักการทำงานของ  helper ตัวนี้จะทำการ สร้าง  user’s authentication token ให้  client แต่ล่ะตัว และ ทำการ  check ค่า  token ใน ฝั่ง server
         ฝั่ง server จะทำการ check ค่า  token

[ValidateAntiForgeryToken]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Product product) {   
//Some code
}

หรือ

[AcceptVerbs(HttpVerbs.Post),ValidateAntiForgeryToken]
public ActionResult Edit(Product product) {   
//Some code
} 

เพิ่ม File Helper  และ  FileResult Type   return  content ที่เป็น Binary 

 
return File(@"c:\temp\test.png"); 

ถ้า Action  เป็น FileResult  >>  จะ  return  
     FilePathResult    path to the response
    FileStreamResult    stream to the response
    FileContentResult   byte array to the response
 
-  Form Helper  เปลี่ยน  dot (.)  ไปเป็น   underscore  เมื่อมีการใช้ arrtibute  ID  , เช่น 

    MVC Beta

<input type="text" name="Person.FirstName" id="Person.FirstName">

    ถ้าเราใช้  jquery  ในการดึงข้อมูลใน  element input

   
$("#Person\\.FirstName")      

MVC RC

<input type="text" name="Person.FirstName" id="Person_FirstName">

หรือ อาจจะใช้  HtmlHelper.IDDotReplacementChar  แทนก็ได้


-  [Bind(Prefix="")] 
 
     โดยปกติ  ถ้าเราสร้าง  action method  และ  renders   edit  form  โดยใช้ products strongly typed view

public ActionResult Edit(int id) {   
   //Some code
  
  
Product product = someRepository.GetProductById();
 
    return View(product);
}

สามารถสร้าง form จาก  html helper Name: Price: สังเกตว่าจะไม่มี  prefix "product" นอกจากนั้นเวลาที่เรา  post  ข้อมูลที่เป็น object  เข้ามายัง  action  method  เช่น

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Product product) {  
 
//Some code
}

โดยปกติเราจะอ้างอิง  prefix  
product.ProductName   หรือ product.UnitPrice   เราไม่ต้องอ้างอิง  prefix  product  ก็ได้หากเราเขียนแบบนี้

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit([Bind(Prefix = "")]Product product) {   
//Some code
}

อีกวิธีหนึ่งคือการนำเอา  object product  เข้าไปเก็บใน  ViewData

 public ActionResult Edit(int id) {   
 
//Some code
   
 
Product product = someRepository.GetProductById();  
 
  
ViewData["product"] = product;
    return View();
}

แบบนี้เราสามารถใช้  prefix   product ใน html helper  ได้เช่นกันName: Price:   

-  
เราสามารถสร้างและ  execute javascriptResult  และ  Javascript Controller   เช่น 

 
public ActionResult DoSomething() {   
      
script s = "$('#some-div').html('Updated!');";
   
     
return JavaScript(s);