ใน ASP.NET MVC โมเดลมุมมองควรมี ID หรือไม่?


11

เมื่อพัฒนาแอปพลิเคชัน ASP.NET MVC ที่อนุญาตให้อัปเดตโมเดลคุณต้องมีวิธีรู้วิธีนำโมเดลมุมมองที่อัปเดตและจับคู่กลับไปยังโมเดลที่ได้รับการอัปเดตในขณะนี้ ดูเหมือนจะมีวิธีการที่แตกต่างกันสองสามอย่างในการทำเช่นนี้และฉันสงสัยว่าสิ่งเหล่านี้ไม่เหมาะสมกับ MVC (เหมือนกับการมีตัวควบคุมที่เก็บข้อมูลของคุณซึ่งควรเป็นแบบจำลองไม่ใช่แบบ MVC ที่เหมาะสม)

ทุกรุ่นที่ดูมีรหัส: ข้อดี

  • ตรวจสอบให้แน่ใจเสมอว่าคุณสามารถจับคู่กับโมเดลของคุณได้

จุดด้อย

  • คุณต้องระมัดระวังอย่างแท้จริงว่าไม่มีการเปลี่ยนแปลง ID ใด ๆ อีกคุณสามารถให้ผู้ใช้อัปเดตแถวที่ไม่ควรเข้าถึงได้

เฉพาะรุ่นมุมมองขั้นต่ำสุดเท่านั้นที่มี ID: ข้อดี

  • จำเป็นต้องตรวจสอบน้อยกว่าเพื่อหลีกเลี่ยงผู้ใช้ที่อัปเดตข้อมูลที่ไม่ควรเข้าถึง

จุดด้อย

  • ยิ่งยากต่อการติดตามว่ามุมมองแบบใดตรงกับโมเดลใด
  • คุณยังคงต้องตรวจสอบรุ่นที่มี ID บางรุ่นเพื่อให้แน่ใจว่าผู้ใช้ไม่ได้อัปเดตข้อมูลที่ไม่ควรเข้าถึง

ไม่มีรุ่นที่มี ID:

ข้อดี

  • ไม่จำเป็นต้องตรวจสอบ ID เพื่อรับการปรับปรุง

จุดด้อย

  • คุณต้องละทิ้งการไร้สัญชาติ

ดังนั้นฉันมีสองคำถาม

ก่อนอื่นมีตัวเลือกที่ถูกต้อง / ไม่ถูกต้องหรือไม่? (ถ้าไม่นั่นหมายความว่าการเลือกเป็นเรื่องของความเห็นและความเห็นของคำถามที่สองเป็นไปตามและควรละเว้น)

ประการที่สองหากมีตัวเลือกที่ถูกต้อง / ไม่ถูกต้องมันคืออะไร?

เพื่อชี้แจงความคิดเห็นที่ฉันพูดคุยเมื่อคุณมีรูปแบบการดูที่เลียนแบบวัตถุฐานข้อมูลของคุณ

คิดว่านี่:

public class InvoiceViewModel  //Does not have ID, does not relate to model.
{
    public CustomerViewModel CustomerVM { get; set; }  //Maybe has ID?  Does relate to model.
    public AddressViewModel BillingAddressVM { get; set; } //Ditto
    public AddressViewModel ShippingAddressVM { get; set; } //Ditto
    public List<InvoiceLineItemViewModel> ItemVMs { get; set; }  //Each one has an ID?
}

ไม่ใช่สิ่งนี้:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

2
คุณจะทำอย่างไรกับ ViewModel ID ไม่ใช่ออบเจ็กต์แต่ละรายการใน ViewModel ที่มี ID ของตัวเองใช่ไหม
Robert Harvey

ฉันควรจะระบุเฉพาะเมื่อโมเดลมุมมองเกี่ยวข้องกับโมเดลเท่านั้น ไม่ใช่ทุกรุ่นที่เกี่ยวข้องกับมุมมอง
Lawtonfogle

You have to abandon statelessness.- คุณเพิ่งเลือกใช้ MVC ไร้จุดหมาย
Joel Etherton

ID ที่คุณอ้างถึงคือคีย์หลักของฐานข้อมูลหรืออย่างอื่นที่คุณเพิ่มใน ViewModel หรือไม่
Vermis

@ แฟร์ฉันคิดว่าคีย์หลักของฐานข้อมูลจะเป็น ID แบบง่าย ID ที่ละเอียดยิ่งขึ้นจะเป็นข้อมูลใด ๆ ที่ไม่สามารถแก้ไขได้ซึ่งช่วยให้คุณสามารถเชื่อมโยงออบเจ็กต์ที่แก้ไขของคุณกลับไปเป็นเวอร์ชันที่ยังไม่แก้ไข แต่ยังคงอยู่เพื่อให้การเปลี่ยนแปลงที่แก้ไขสามารถคงอยู่ได้
Lawtonfogle

คำตอบ:


1

วัตถุ ViewModel ไม่ใช่สิ่งที่ได้รับการจัดเก็บในตารางฐานข้อมูลโดยทั่วไป เป็นของแต่ละรายการในวัตถุ ViewModel ที่เก็บไว้ แต่ละรายการเหล่านั้นมีรหัสแล้ว

ตัวอย่างเช่น:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

เนื่องจากไม่มีตารางเดียวในฐานข้อมูลที่สอดคล้องกับ InvoiceViewModel จึงไม่มี ID สำหรับวัตถุ InvoiceViewModel

แน่นอนคุณสามารถใช้ InvoiceID เป็นรหัสสำหรับ ViewModel นี้โดยเฉพาะ InvoiceID นั้นมีประโยชน์เพราะนั่นคือสิ่งที่วัตถุนี้แสดงให้เห็นในที่สุด แต่ฉันเห็นว่ามีวัตถุ ViewModel ที่ไม่สอดคล้องกับ ID ใด ๆ ในฐานข้อมูล


1
คิดว่าที่ไหนแทนที่จะใช้โมเดลจริงในโมเดลมุมมอง InvoiceViewModel มีเฉพาะโมเดลมุมมองอื่น ๆ (ซึ่งเกี่ยวข้องกับโมเดล)
Lawtonfogle

-1

โดยค่าเริ่มต้นคุณควรมี ID ในมุมมองแม้ว่าคุณจะไม่ได้ใช้มัน สร้างคอลัมน์ในฐานข้อมูลชื่อเป็นidและทำเครื่องหมายที่auto incrementคุณลักษณะเพื่อให้คุณจะถูกจัดเรียง


1
ตรงนี้ขัดแย้งกับคำตอบอื่น ๆ แม้ว่าโดยไม่ต้องอยู่ว่าทำไมคุณควรมีรหัสอยู่แล้ว
Martijn Pieters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.