ASP.NET MVC Model เทียบกับ ViewModel


92

ตกลงฉันได้รับฟังการอภิปรายเกี่ยวกับ "ViewModels" เกี่ยวกับ ASP.NET MVC ของ MS

ตอนนี้ที่ตั้งใจให้เป็น Model เฉพาะใช่ไหม? ไม่ใช่มุมมองที่เฉพาะเจาะจง

ตามความเข้าใจของฉันมันเป็น Model ชนิดหนึ่งที่มีจุดประสงค์เฉพาะในการโต้ตอบกับ View? หรืออะไรทำนองนั้น?

ขอขอบคุณคำชี้แจงบางประการ

คำตอบ:


72

โมเดลพื้นฐานและโมเดลมุมมองเป็นคลาสง่ายๆที่มีคุณสมบัติ

วัตถุประสงค์หลักของคลาสเหล่านี้คือเพื่ออธิบาย (ถึง "โมเดล") อ็อบเจกต์สำหรับผู้ชมตามลำดับซึ่งเป็นผู้ควบคุมและมุมมองตามลำดับ

ดังนั้นคุณพูดถูกต้องสมบูรณ์เมื่อคุณพูด

ตามความเข้าใจของฉันมันเป็น Model ชนิดหนึ่งที่มีวัตถุประสงค์เฉพาะในการโต้ตอบกับ View

ดังนั้นในขณะที่คลาส Model เป็นเอนทิตีโดเมนที่มีประสิทธิภาพซึ่งแอปพลิเคชันของคุณโต้ตอบด้วย View Models เป็นคลาสง่ายๆที่มุมมองของคุณโต้ตอบด้วย

หวังว่าจะช่วยได้ :)

อัปเดต :

Microsoft ได้พัฒนารูปแบบการนำเสนอเฉพาะรุ่นโดย Martin fowler โดยส่วนใหญ่ใช้ Model-View-Controller และเรียกมันว่า Model-View-ViewModel (MVVM) สำหรับแอปพลิเคชัน PF รูปแบบนี้กำหนดเป้าหมายไปที่แพลตฟอร์มการพัฒนา UI สมัยใหม่ซึ่งนักพัฒนา UI มีข้อกำหนดที่แตกต่างกันตามตรรกะทางธุรกิจมากกว่านักพัฒนาแบบเดิม ลองดูทฤษฎีเล็กน้อยที่นี่


1
ตกลงขอบคุณและขอบคุณสำหรับการอัปเดตซึ่งมีประโยชน์มาก! ดังนั้นโดยไม่คำนึงถึงเวอร์ชันพิเศษของ MS ที่มี MVC 2 ในสต็อกคุณวาง ViewModels ไว้ในโฟลเดอร์พิเศษที่กำหนดหรือไม่? หรือโดยพื้นฐานแล้วพวกเขาเพียงแค่เข้าไปในโฟลเดอร์ Models เหมือนกับที่อื่น ๆ หรือคุณสามารถทำได้หรือไม่?
Qcom

ยินดี. โดยปกติฉันจะวางโมเดลและดูโมเดลไว้ในโฟลเดอร์เดียวกันเพราะฉันต้องการจัดกลุ่มเข้าด้วยกันตามโดเมนที่พวกเขาอ้างถึง แต่นั่นเป็นเพียงตัวเลือกของฉันและฉันมั่นใจว่ามีที่ดีกว่า
ลอเรนโซ

5
ViewModel ควรแยก View จาก (domain) Model ดังนั้นจึงเหมาะสมที่จะวาง ViewModel ไว้ใกล้ View ไม่ใช่ใกล้ Model
Vitaliy Ulantikov

ฉันจะเก็บคลาส 'Model' ไว้นอกโปรเจ็กต์ MVC ของฉันแทนที่จะอยู่ในโฟลเดอร์ Model - ฉันจะเก็บคลาส View Model ไว้ในโปรเจ็กต์ MVC ดังนั้นตามที่ Vitaliy บอกว่าพวกเขาจะอยู่ใกล้ View
Dan Harris

@Lorenzo ในบรรทัดแรกคุณพูดว่า "ทั้งสองคลาสธรรมดาที่มีคุณลักษณะ" ฉันคิดว่าคุณหมายถึงคุณสมบัติ? ถ้าไม่คุณอ้างถึงคุณลักษณะใด แอตทริบิวต์เทียบกับคุณสมบัติ
xr280xr

69

ในแง่ที่ง่ายที่สุดฉันชอบคิดสิ่งต่อไปนี้:

โมเดล:ดูและให้ความรู้สึกเหมือนโมเดลข้อมูลของคุณอย่างเคร่งครัด สำหรับเจตนาและวัตถุประสงค์ทั้งหมดเป็นเพียงการแสดงคลาสของโมเดลข้อมูลของคุณ ไม่มีความรู้เกี่ยวกับมุมมองของคุณหรือองค์ประกอบใด ๆ ในมุมมองของคุณ ที่กล่าวว่าไม่ควรมีตัวตกแต่งแอตทริบิวต์ใด ๆ (เช่นจำเป็นความยาว ฯลฯ ) ที่คุณจะใช้สำหรับมุมมองของคุณ

View Model:ทำหน้าที่เป็นตัวประสานข้อมูลระหว่าง View และ Model ของคุณและในหลาย ๆ กรณีก็เป็น Wrapper สำหรับ Model ของคุณเช่นกัน มันจะถูกทำให้ไร้ประโยชน์หากไม่มี View ดังนั้นโดยทั่วไปแล้วจะไม่สามารถใช้ซ้ำได้ในหลาย ๆ View และ Controllers เหมือนรุ่นมาตรฐาน

ตัวอย่างเช่นโมเดลของคุณอาจมีคุณสมบัติดังต่อไปนี้ซึ่งเป็นการแสดงถึงแหล่งข้อมูลของคุณโดยตรง:

    public string FirstName { get; set; }
    public string LastName { get; set; }

ตอนนี้เนื่องจาก View Model ของคุณเชื่อมโยงกับ View ของคุณโมเดลอาจมีคุณสมบัติดังต่อไปนี้ซึ่งเชื่อมฟิลด์ FirstName ของโมเดลและฟิลด์ LastName เข้าด้วยกันเป็นสตริงเดียว:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}

2
คุณช่วยยกตัวอย่าง ViewModel ที่สมบูรณ์กว่านี้ได้ไหม มันรู้ได้อย่างไรว่า myModel คืออะไรและจะรับข้อมูลสำหรับ myModel ได้อย่างไร
M Kenyon II

5
โดยธรรมชาติแล้ว ViewModel เป็นออบเจ็กต์ C # (POCO) แบบธรรมดาและจะไม่มีทางรู้อย่างแท้จริงว่าโมเดลข้อมูลของคุณมีลักษณะอย่างไร เป็นการผสมผสานระหว่างโมเดลข้อมูลและองค์ประกอบเฉพาะที่มุมมองของคุณต้องแสดงมากกว่า เท่าที่จะได้รับข้อมูลคุณต้องโหลดด้วยข้อมูล ฉันต้องการใช้คลาสตัวกลางแยกต่างหากโดยที่ฉันเรียกใช้บริการของฉันสำหรับข้อมูลจากนั้นโหลดข้อมูลนั้นลงใน ViewModel ด้วยตนเอง จากนั้นฉันส่งคืน ViewModel ที่โหลดเต็มไปยังแอ็คชันคอนโทรลเลอร์
Jason Marsell

26

ฉันพบว่าบทความนี้เป็นแหล่งข้อมูลที่มีประโยชน์มากในการทำความเข้าใจว่า "แบบจำลองโดเมน" และ "ดูโมเดล" โต้ตอบกันอย่างไรภายในแอปพลิเคชัน MVC โดยเฉพาะอย่างยิ่งในเรื่องการเชื่อมโยง สิ่งที่ดีที่สุดคือมีตัวอย่างแทนคำอธิบายนามธรรม

"ตั้งแต่ MVC ได้รับการเผยแพร่ฉันสังเกตเห็นความสับสนอย่างมากเกี่ยวกับวิธีสร้างโมเดลมุมมองที่ดีที่สุดบางครั้งความสับสนนี้ก็ไม่ได้เป็นไปโดยไม่มีเหตุผลที่ดีเนื่องจากดูเหมือนว่าจะไม่มีข้อมูลมากมายเกี่ยวกับคำแนะนำแนวทางปฏิบัติที่ดีที่สุดนอกจากนี้ไม่มี โซลูชัน "ขนาดเดียวที่เหมาะกับทุกคน" ที่ทำหน้าที่เป็นสัญลักษณ์แสดงหัวข้อย่อยเงินในโพสต์นี้ฉันจะอธิบายรูปแบบหลักบางส่วนที่เกิดขึ้นและข้อดี / ข้อเสียของแต่ละรูปแบบสิ่งสำคัญคือต้องสังเกตว่ารูปแบบเหล่านี้มีหลายรูปแบบ เกิดขึ้นจากผู้คนที่แก้ปัญหาในโลกแห่งความเป็นจริง "

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


19

วิกิพีเดียมีคำอธิบาย Model vs. ModelView ที่สมบูรณ์มากกว่าที่คุณจะได้รับในคำตอบ SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

ฉันอ้าง:

โมเดล : เช่นเดียวกับในรูปแบบ MVC แบบคลาสสิกโมเดลจะอ้างถึง (a) โมเดลอ็อบเจ็กต์ที่แสดงถึงเนื้อหาสถานะจริง (แนวทางเชิงวัตถุ) หรือ (b) ชั้นการเข้าถึงข้อมูลที่แสดงถึงเนื้อหานั้น (ข้อมูล - แนวทางศูนย์กลาง)

มุมมอง : เช่นเดียวกับรูปแบบ MVC แบบคลาสสิกมุมมองหมายถึงองค์ประกอบทั้งหมดที่แสดงโดย GUI เช่นปุ่มหน้าต่างกราฟิกและตัวควบคุมอื่น ๆ

ViewModel : ViewModel เป็น“ Model of the View” ซึ่งหมายความว่าเป็นนามธรรมของ View ที่ทำหน้าที่ในการเชื่อมโยงข้อมูลระหว่าง View และ Model อาจถูกมองว่าเป็นลักษณะพิเศษของสิ่งที่จะเป็น Controller (ในรูปแบบ MVC) ที่ทำหน้าที่เป็นตัวประสาน / ตัวแปลงข้อมูลที่เปลี่ยนข้อมูล Model เป็น View information และส่งคำสั่งจาก View ไปยัง Model ViewModel แสดงคุณสมบัติสาธารณะคำสั่งและ abstractions ViewModel ได้รับการเปรียบเทียบกับสถานะแนวคิดของข้อมูลเมื่อเทียบกับสถานะจริงของข้อมูลใน Model


3
แม้ว่าจะมีคำอธิบายของ Model และ ViewModel ลิงก์นั้นเป็นเพียงการอธิบายรูปแบบสถาปัตยกรรม MVVM ไม่ใช่ความแตกต่างระหว่าง Model และ View Models
Lorenzo

5

มีแนวคิดเกี่ยวกับ ViewModel แต่โดยทั่วไปแล้วจะไม่เกี่ยวข้องกับ Asp.net MVC MVC ใช้รูปแบบ Model View Controller ซึ่งคอนโทรลเลอร์จะจัดการการโต้ตอบสร้างข้อมูลจาก Model จากนั้นส่งข้อมูลนั้นไปยัง View for display

ViewModels (และรูปแบบ Model View ViewModel) โดยทั่วไปจะเกี่ยวข้องกับ Silverlight และ WPF มากกว่า Xaml แตกต่างกันเล็กน้อยตรงที่มุมมองสามารถเชื่อมโยงสองทางกับ ViewModels ได้ดังนั้นเทคโนโลยีจึงแตกต่างกันเล็กน้อย ตัวอย่างเช่นหากคุณผูกกล่องข้อความเข้ากับเขตข้อมูลเมื่อคุณพิมพ์ลงในกล่องข้อความนั้นค่าของเขตข้อมูลจะได้รับการอัปเดตแบบไดนามิก การโต้ตอบประเภทนี้ไม่สามารถทำได้จริงในหน้าเว็บเนื่องจากหน้าเว็บไม่มีสถานะ

ความคล้ายคลึงกันในสองรูปแบบคือทั้งสองพยายามแยกตรรกะออกจากการแสดงผล การใช้งาน / เหตุผลที่พบบ่อยที่สุดคือการทดสอบ: คุณต้องการดำเนินการจากโค้ด (ผ่านกรอบการทดสอบ) การโต้ตอบทั้งหมดที่ผู้ใช้จะเรียกใช้ผ่านอินเทอร์เฟซผู้ใช้


ในหนังสือที่ฉันกำลังอ่าน "Professional ASP MVC 2" ViewModel ได้รับการแนะนำในบทที่ 1 เพื่อใช้ในการรักษาการโต้ตอบของงานนำเสนอ / โมเดลทั้งที่พิมพ์มากและแห้ง ผู้เขียนไมโครซอฟท์ ได้แก่ Scott Hansleman, Phil Haack, Scott Guthrie
Berryl

เมื่อเร็ว ๆ นี้ฉันได้เห็นมากขึ้นว่า ViewModel ถูกใช้ใน Asp.net MVC ดูเหมือนว่า ViewModel จะมีมุมมองทางธุรกิจมากกว่า Domain Model ดังนั้นรูปแบบที่เราใช้คือการให้โมเดลโดเมนประกอบส่วนหลัก ๆ ของ ViewModel ปัจจุบันเราใช้รูปแบบคำสั่งที่ปรับเปลี่ยน (การดำเนินการ) ที่ทำงานร่วมกับโมเดลโดเมนเพื่อดำเนินการ ผลลัพธ์จะถูกประกอบเข้ากับ ViewModel และส่งไปยังมุมมอง viewmodel ในกรณีนี้มีคำอธิบายประกอบทั้งหมดและตรรกะที่เน้นที่เรียบง่ายซึ่งสนับสนุนมุมมอง
Sinaesthetic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.