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 ได้โดยที่ไม่รู้ตัว
ตัวอย่าง
[HttpPost]
public ViewResult Edit(User user)
{
// ...
}
ฝั่ง View หน้าตาเป็นแบบนี้
@using (Html.BeginForm()) {
@Html.EditorFor(model => model.FirstName)
@Html.EditorFor(model => model.LastName)
}
สร้างโลเดลตามฟอร์ม
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; }
}
ส่วนโมเดลจริง
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int TotalAmount { 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; }
[ReadOnly(true)]
public int TotalAmount { get; set; }
}
4. ใช้ [Bind] attribute : วิธีนี้เราสามารถเลือกเอาเฉพาะบางฟิลไปอัพเดตได้ หรือไม่เลือกบางฟิลล์ได้เช่นกัน เป็นวิธีที่เราจะเห็น จำนวนฟิลล์ชัดเจนตัวอย่าง แบบเลือกเอาเฉพาะฟิลล์
[HttpPost]
public ViewResult Edit([Bind(Include = "FirstName,LastName")] User user)
{
// ...
}
แบบไม่เลือกบางฟิลล์
[HttpPost]
public ViewResult Edit([Bind(Exclude = "TotalAmount")] User user)
{
// ...
}
เป็นอันเสร็จสิ้นครับ ที่มาของบทความ http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx
ไม่มีความคิดเห็น:
แสดงความคิดเห็น