\

Facebook


วันพุธที่ 2 สิงหาคม พ.ศ. 2560

4 วิธี รับค่าจาก Form ใน ASP.NET MVC แบบมือโปร



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

ไม่มีความคิดเห็น:

May be like this posts