Form Post คือ โครตพื้นฐานการส่งข้อมูลบนเว็บไซด์แล้ว โดยฟอร์มจะทำหน้าที่สร้าง FormData ขึ้นมาเพื่อ POST กลับไปยัง SERVER
1. สร้างตัวแปรมารองรับใน controller : อันนี้คือวิธี basic ที่สุดโดยการตั้งชื่อตัวแปรให้ตรงกับชื่อ input การทำแบบนี้ถ้ามีการเปลี่ยน Model คุณก็ต้องมาเพิ่มหรือลด ตัวแปรใน controller เอง ไม่แนะนำ
ตัวอย่าง
[HttpPost] public ViewResult Edit(string FirstName) { ... }
2. สร้าง Interface / Class มารองรับ : ก็คือการสร้าง Model ขึ้นมา โดยตั้งชื่อตัวแปรให้ตรงกับชื่อ input แล้วโมเดลก็จะถูก Blinding อัตโนมัติ อันตรายของวิธีนี้คือ ถ้าคุณเล่นเอาโมเดลที่รับจากฟอร์ม โยนไป Database ตรงๆ โอกาสที่จะถูกอัพเดตผิดฟิลล์ก็เกิดขึ้น เช่น ในโมเดล มีฟิลล์ TotalAmount แต่ไม่มีการรับค่าจากฟอร์ม แฮกเกอร์ก็สามารถส่งค่าเข้ามาได้ หากเราข้ามการตรวจสอบไปก็อาจถูกอัพเดต TotalAmount ได้โดยที่ไม่รู้ตัว
ตัวอย่าง
ฝั่ง View หน้าตาเป็นแบบนี้[HttpPost] public ViewResult Edit(User user) { // ... }
สร้างโลเดลตามฟอร์ม@using (Html.BeginForm()) { @Html.EditorFor(model => model.FirstName) @Html.EditorFor(model => model.LastName) <input type="submit" value="Save"> }
public class User { public string FirstName { get; set; } public string LastName { get; set; } public int TotalAmount { get; set; } }
ลองเอา Interface ไปรับค่าจากฟอร์มแทน แต่ตัว Class ให้สร้าง Property ที่มากกว่าก็สามารถแก้บัญหานี้ได้ระดับหนึ่ง
อินเทอเฟสหน้าตาแบบนี้[HttpPost] public ViewResult Edit(IUserInputModel user) { // ... }
ส่วนโมเดลจริงpublic interface IUserInputModel { string FirstName { get; set; } string LastName { get; set; } }
3. หรือตั้งค่า property ของ class เป็น ready only เพียงเท่านี้ ก็ไม่สามารถ set ค่าลง model class ได้ละ เเต่มันใช้ได้กับ MVC 4 , 5 ขึ้นไปpublic class User { public string FirstName { get; set; } public string LastName { get; set; } public int TotalAmount { get; set; } }
4. ใช้ [Bind] attribute : วิธีนี้เราสามารถเลือกเอาเฉพาะบางฟิลไปอัพเดตได้ หรือไม่เลือกบางฟิลล์ได้เช่นกัน เป็นวิธีที่เราจะเห็น จำนวนฟิลล์ชัดเจนpublic class User { public string FirstName { get; set; } public string LastName { get; set; } [ReadOnly(true)] public int TotalAmount { get; set; } }
ตัวอย่าง แบบเลือกเอาเฉพาะฟิลล์
แบบไม่เลือกบางฟิลล์[HttpPost] public ViewResult Edit([Bind(Include = "FirstName,LastName")] User user) { // ... }
เป็นอันเสร็จสิ้นครับ ที่มาของบทความ http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx[HttpPost] public ViewResult Edit([Bind(Exclude = "TotalAmount")] User user) { // ... }
ไม่มีความคิดเห็น:
แสดงความคิดเห็น