\

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)
    <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; }
}

ส่วนโมเดลจริง

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

  • [Xdebug] PHP Debug on Eclipse เซ็ตตัวดีบักเกอร์
    03/04/2014 - 0 Comments
    พูดถึงวิธีดีบักไฟล์ PHP ถ้าเป็นครั้งแรกที่เริ่มจับใหม่ๆมั่นใจเลยว่าหลายๆคนต้องเคย echo ค่าออกมาทีละบบรทัด…
  • สร้าง WebApp ด้วย VueJS บน Digital Ocean ตอนที่ 3 : ติดตั้ง MongoDB บน Debian 8
    19/05/2018 - 0 Comments
    อย่างที่เกริ่นไปก่อนว่าผมใช้ database เป็น NoSQL ซึ่งผมใช้ MondgoDB มาเป็นตัวจัดการฐานข้อมูล…
  • [Winform C#] ทำตัวอินสตอร์ด้วย Install Shield
    26/08/2014 - 0 Comments
    หลังจากเขียนโปรแกรม Winform c# เรียบร้อยเเล้วถึงเวลาแปลงเป็นตัว exe ให้คลิกใช้ง่ายๆสักที…
  • ยุคสมัยแห่ง Automate เมื่อ Selenium เข้ามาเป็น QA แทนมนุษย์ (Part 1)
    22/06/2017 - 0 Comments
    ยอมรับสักทีเถอะว่ายุคนี้ ปี 2017 มันเริ่มเข้าสู่ยุคหุ่นยนต์แล้ว ไหนจะรถไร้คนขับ ไหนจะ AlphaGo…
  • ว่างจัด! ทำเว็บดึง Facebook Graph API ง่ายๆ
    04/08/2014 - 0 Comments
    ไม่ได้เขียน BLOG มาร่วม 3 เดือนละมั้งครับเนี้ย วันนี้ขออัพเดตหน่อยละกันครับ…
  • สร้าง WebApp ด้วย VueJS บน Digital Ocean ตอนที่ 2 : ติดตั้ง nodejs + npm
    18/05/2018 - 0 Comments
    NodeJS คือ JavaScript framework ที่ใช้ทำ back-end ซึ่งในเคสของผม ผมเลือกเพื่อมาเป็นตัว API สำหรับให้…
  • เล่น Pokemon Go บนคอม วิ่งในเกมส์ 10 km แบบไม่ต้องลุกจากที่นั่ง !!
    10/08/2016 - 0 Comments
    ***เพิ่มเติม : ปัจจุบันผมเลิกเล่นผ่าน emulator เเล้วนะครับ บทความนี้กลายเป็นอดีตไปละ…