Posts Tagged ‘mvc’

Dev :: ASP.NET MVC 3 และการ Upload File

Posted: กันยายน 22, 2011 in asp.net
ป้ายกำกับ:, , , , , ,

จุดประสงค์

สาธิตการสร้างเว็บแอพเพื่ออัพโหลดแฟ้มข้อมูลจาก Client ไปวางบนโฟลเดอร์ที่อนุญาต บนเครื่องแม่ข่าย

สิ่งที่ต้องมี

  • Visual Studio 2010
  • มีความรู้เกี่ยวกับ MVC

 

การปฏิบัติ

  1. สร้างโครงการขึ้นใหม่ เลือก MVC 3 ตั้งชื่อว่า MvcFileUpload

image

2.เลือก Interner Application แล้วคลิก OK

 image

 

3. คลิกขวาที่ Folder Controllers แล้ว Add Controller สำหรับผมตั้งชื่อว่า FileUpload และใช้เทมเพลตแบบว่าง แล้วคลิกปุ่ม Add

image

 

4.เรียกใช้ system.io ที่ด้านบน

clip_image001

 

5. จากนั้นสร้าง Action ดังต่อไปนี้

image

 

6. เพิ่ม view ที่ action Edit ด้วยการคลิกขวาที่ Action Edit แล้วเลือก Add view แล้วคลิกปุ่ม Add

image

 

7. ไปที่ Edit.cshtml

แล้วเพิ่มโค้ดลงไปดังนี้

image

 

8.เปิดไฟล์ _Layout.cshtm จากที่นี่

image

 

9.เพิ่ม ActionLink เพื่อเข้าถึงหน้า Upload เข้าไปดังนี้

image

10. จากนั้นทดลอง Run กด F5 จะได้ผลดังนี้

image

 

11.คลิกที่ Upload จะเข้าสู่ วิว Edit ให้ลอง Upload File

image

 

12. เมื่อ Submit ไปแล้วจะกลับมาที่ Home/Index ลองเปิด Folder เพื่อตรวจสอบว่าอัพโหลดไปได้จริงหรือไม่

จะพบไฟล์ที่อัพขึ้นไปดังนี้

image

 

13. จบแล้วครับ ไม่ยากเนอะ

อ้างอิงจาก

http://www.c-sharpcorner.com/UploadFile/dhananjaycoder/Fileuploadinaspnetmvc06292009030526AM/Fileuploadinaspnetmvc.aspx

 

การแสดงข้อมูลจาก Entity หรือตัวแทนจากตารางในฐานข้อมูลเดียวเป็นเรื่องปกติ

แต่หากต้องแสดงข้อมูลจาก entity อื่นที่มีความสัมพันธ์กันต้องเพิ่มอะไรลงไปนิดหน่อย

 

จากตอนที่แล้วผมสร้างแอพพลิเคชั่นจากฐานข้อมูลที่มีเดิมอยู่แล้ว

แล้วมาสร้าง entity datamodel แล้วค่อยมาสร้าง class ที่ทำงานทีหลัง

ไม่ใช่สร้างแบบ poco คือสร้างโค้ดก่อนแล้วไปเจนเนเรทฐานข้อมูล ผมคิดว่าอาจจะไม่เขียนเพราะ ตย ในเว็บอื่นๆมีมากพอแล้ว

 

วัตถุประสงค์

ต้องการแสดงรายชื่อนักเรียน

ต้องการคลิกที่ชื่อแล้วแสดงรายวิชา + เกรดที่ได้ของนักเรียน

 

นี่คือ edm ของระบบ

image

 

1. เพิ่ม Controller ลงไปชื่อ StudentController กำหนดค่า

image

ที่ช่องเทมเพลต กำหนดให้สร้าง crude

โมเดลให้เลือกชี้ไปที่คลาสที่สร้างขึ้นจากตอนที่แล้ว

และcontext เลือก schoolentity ก้ได้จากการสร้างตอนที่แล้วเช่นกัน

แล้ว add ลงไป

 

2.แก้โค้ดที่ StudentController เมทอส Details ดังนี้

image

จะเห็นว่าผมแก้โค้ดให้มี include เอา entity ที่ติดต่อโดยตรงเข้าไปก่อน

แล้วไปเรียก select เอา entity ที่ติดต่อถัดไปเข้ามา

 

3.เปิด view  detail ของ student

image

 

4. ภายใน tag ของ fieldset ให้เพิมตารางแสดงรายการวิชาและเกรดที่ได้เข้าไปด้วยการวนลูปดังนี้

image

 

เมื่อทดลองรันจะได้ดังนี้

 

image

เมื่อคลิกที่ detail ของ นร สักคน

image

จะได้รายวิชาที่ลงเรียนและเกรด(หากมี)

 

จบแล้วครับ ไม่เข้าใจเหมือนกันว่าทำไมทำตาม tutorial แล้วมีปัญหามาตลอด

หรือผมโง่เกินไปก็ไม่ทราบได้ หากใครฉลาดๆโปรดเข้ามาให้คำสอนด้วยครับ

 

การสร้าง Model จากฐานข้อมูลที่มีอยู่เรียกว่า database first

1.เมื่อเราได้สร้างฐานข้อมูลแล้ว สร้างตารางและความสัมพันธ์เอาไว้ก่อนแล้ว

image

 

2.เพื่อความแน่ใจให้ดูใน web.config ว่ามี connection string ที่เชื่อมต่อระบบของเราเข้ากับ database ที่เราได้สร้างเอาไว้หรือยังหากยังให้กำหนดค่าดังนี้

image

 

3.ให้สร้าง Entity Data Model ขึ้นมา ที่โฟลเดอร์ Model ให้เพิ่ม Entity data model ลงไป

ตั้งชื่อ SchoolModel

4.เลือก Generate จาก Database

image

 

5.ที่ connection เลือกไปยัง database ที่เราได้สร้างเอาไว้

image

 

6.ด้านล่างให้บันทึก entity connection ลง web.config

image

 

เลือกตารางที่ใช้

image

 

และตั้งชื่อว่า SchoolModel

image

 

6. เลือก build project แล้วสร้าง class จาก edm ด้วยการคลิกขวาในหน้าการออกแบบ edm

image

 

7. เลือก code แล้วเลือก Self tracking

image

 

8. เราจะได้คลาสตามที่ edm ได้สร้างเอาไว้

image

 

จบแล้วครับ

 

บทความนี้ได้สรุปและเรียบเรียงจาก blog ของ Scott  ต้องการอ่านคลิกที่นี่

 

View คือมุมมองหรือ UI ที่รับข้อมูลจาก User ไปดำเนินการ และนำเสนอข้อมูลให้ user ได้เห็น

View Engine ที่มาพร้อมกับ mvc3 ชื่อว่า Razor (มีดโกน ??)

engine ส่วนต่างๆ ของ mvc ตามที่เคยศึกษากันพบว่ามันแบ่งการทำงานออกจากกัน

ดังนั้นหากเราสามารถพัฒนา engine ขึ้นมาได้เองเพื่อติดต่อกับฐานข้อมูลหรือส่วนอื่นๆที่ต้องการได้

ทาง ms ก็นำเสนอ Razor ซึ่งเป็น view engine ตัวใหม่อย่างมากว่าดีอย่างนั้นอย่างนี้

 

คอนเซ็บของ Razor

  • Compact, Expressive, and Fluid: ขนาดเล็กและลื่นไหล (ผมนึกถึงมอเตอร์ไซ ที่ขับตอนรถติดยังไงยังงั้นเลย)

  • Easy to Learn:  เรียนรู้ง่ายหรือใช้ความรู้เดิมที่มีอยู่เช่น HTML
  • Is not a new language: ใช้ความรู้ทางภาษาโปรแกรมมิ่งเดิมที่รู้อยู่แล้ว  C#/VB (or other)

  • Works with any Text Editor: ทำงานกับเครื่องมือหรือใดๆก็ได้เช่น notepad

  • Has great Intellisense: มีตัวช่วยเติมเต็มประโยคที่ดี แน่นอนว่า visual studio กิน.

  • Unit Testable: สามารถทดสอบได้ง่าย (Confused smile).

 

เปรียบเทียบการแสดงผล

ในบทความคุณ scott จะแสดงข้อความที่เพจดังนี้

 

image

ภาพ 1 แสดง O/p ที่ต้องการ

 

เดิมเราใช้ .aspx nuggets คือแท็ก <% =…. %> แบบนี้เพื่อกำหนดการแสดงผล ประมวลผลที่หน้าเว็บเพจ ดังนี้

image

 

 

แต่หากใช้มีดโกนอาบน้ำผึ้งคุณเขียนโค้ดดังนี้

image

 

Razor ใช้เพียง @ นำหน้าตัวแปร หรือ expression ที่ต้องการใช้เท่านั้น

 

การวนลูป

หากเราต้องการแสดงลูปดังภาพนี้

 

image

จากภาพเราๆก็ทราบดีว่าต้องวนลูปจากลิสหรืออาเรย์หรืออื่นๆ แล้วไปแสดงผล

หากวนลูปด้วย .aspx จะเขียนดังนี้

.aspx nuggets Razor
image image

ดูเรียบร้อยขึ้นนะครับ Winking smile

 

การใช้ If – else

image

การเขียนแบบนี้สมัยก่อนเรียกว่าสปาเก็ตตี้โค้ด คือมันปนกันระหว่างบล็อคคำสั่ง กับแท็ก html

แต่ด้วย tool ของ ms คงไม่เป็นปัญหาเท่าใดเพราะช่วยแยกความแตกต่างระหว่าง view engine

กับแท็ก html ได้

 

การเขียนแบบหลายบรรทัด

image

การเขียนแบบนี้เปิดด้วย @{…} แล้วเขียน expression เอาไว้ภายใน จากนั้นนำค่าที่ได้จากการประมวลผลไปใช้ต่อไป

 

การเขียนแบบบรรทัดเดียวแต่หลายส่วน

image

เปิดแท็กด้วย @(….) แบบนี้ใช้ได้เพียงบรรทัดเดียว

 

เมื่อศึกษาผมมีคำถามที่เกิดขึ้นทันทีคือ email address จะถูกแปลเป็นตัวแปรหรือไม่

ทางคุณ scott เขียนไว้ว่าไม่มีปญหาหาเพราะ engine ฉลาด 5555++

ภาพนี้เป็นข้อมูลที่กำหนดใน editor

image

 

ภาพนี้เป็นข้อมูลที่แสดงที่ web browser

image

 

การเขียนแบบโค้ดภายใน

เราสามารถวางแท็ก html ภายในโค้ดบล็อคของ Razor ได้เช่น

image

เห็นว่าภายในมีแท็ก span ครอบเมื่อรันที่เว็บบราวเซอร์จะได้ดังนี้

image

 

การจัดการ Layout ตามแบบ Razor

หากใช้ .aspx จะใช้ masterpage เข้ามาสร้างหน้ากากและเว้นพื้นที่ให้นำไปใช้ทีหลัง

เมื่อเราเปลี่ยนไปใช้ Razor ใช้เพียง Sitelayout.cshtml เท่านั้น

ภายในมีเพียงแท็ก html ที่คงที่เพื่อแสดงผล

image

ภายในแท็ก div จะมีประกาศ @RenderBody() เพื่อให้รู้ว่านี่คือพืนที่แสดงข้อความเมื่อ layout นี้ถูกนำไปใช้

 

การจะนำเลย์เอาไปใช้ต้องประกาศการเรียกใช้ดังนี้้

image

 

จะต่างกับการใช้ masterpage ที่ประกาศอะไรอีกมากมาย

 

เมื่อรันเราตจะได้โค้ดที่เว็บบราวเซอรดังนี้

image

 

การเขียนทับพื้นที่แสดงผล

 

เราสามารถสร้างพื้นที่การแสดงผลที่ต้นแบบได้มากกว่าที่เดียวดังนี้

image

ที่เพิ่มขึ้นมาคือ @RenderSection พร้อมกับกำหนดชื่อ และมี optional เป็น true เพราะหากไม่มีการกำหนดค่าก็ะไม่ Error หากไม่กำหนดค่า

 

สำหรับเพจหรือวิวที่นำเลยเอาท์นี้ไปใช้ และต้องการเขียนข้อมูลงในแท็ก menu กับ footer ทำได้ดังนี้

image

 

และเมื่อรันที่ปลายทางจะได้โค้ดดังนี้

image

 

html helper ตัวใหม่

ผมเรียกว่าตัวช่วยสร้าง html คล้ายกับการสร้าง function แล้วให้ส่งค่าออกมาเป็นแท็ก html

 

image

ภาพนี้เป็นการสร้าง helper ชื่อ ProductListing และรับพารามิเตอร์มาเพื่อวนลูปสร้างแท็ก li

 

เมื่อต้องการเรียกใช้ helper กำหนดลงไปดังนี้

image

 

อย่างไรก็ดี visual studio ก็สนับสนุนเป็นอย่างดี

จบแล้วสำหรับวันนี้ bye.