• استفاده از چند Model در یک Razor در ASP.NET MVC 5 - قسمت اول
استفاده از چند Model در یک Razor در ASP.NET MVC 5 - قسمت اول
1395/09/15 - 12:24:50 // MVC 5 & 6 // 0 نظر // 5827 بازدید

یکی از مواردی که ASP.NET همواره مطرح بوده و راهکارهای استاندارد یا ابداعی زیادی برای آن وجود دارد، ارسال بیش از یک Model به View میباشد.

بسمه تعالی

استفاده از چند Model در یک Razor در ASP.NET MVC 5

یکی از مواردی که ASP.NET همواره مطرح بوده و راهکارهای استاندارد یا ابداعی زیادی برای آن وجود دارد، ارسال بیش از یک Model به View میباشد.

اجازه بدهید به صورت یک Problem/Solution این مورد و راهکارهای آنرا مورد بررسی قرار دهیم.

در ابتدا به شرح مسئله خواهیم پرداخت. سناریوی یک صفحه در یک پروژه به شرح زیر است.

وضعیت Model به شکل زیر مفروض است.

  1. public class Teacher{  
  2.     public int TeacherId { getset; }  
  3.     public string Code { getset; }  
  4.     public string Name { getset; }  
  5. }   
  6. public class Student{  
  7.     public int StudentId { getset; }  
  8.     public string Code { getset; }  
  9.     public string Name { getset; }  
  10.     public string EnrollmentNo { getset; }  
  11. }   

حال از طریق دو متد در Controller رکوردها و داده ها را به View میتوان ارسال کرد.

private List<Teacher> GetTeachers(){
List<Teacher> teachers = new List<Teacher>();
teachers.Add(new Teacher { TeacherId = 1, Code = "TT", Name = "Tejas Trivedi" });
teachers.Add(new Teacher { TeacherId = 2, Code = "JT", Name = "Jignesh Trivedi" });
teachers.Add(new Teacher { TeacherId = 3, Code = "RT", Name = "Rakesh Trivedi" });
return teachers;
}

public List<Student> GetStudents(){
List<Student> students = new List<Student>();
students.Add(new Student { StudentId = 1, Code = "L0001", Name = "Amit Gupta", EnrollmentNo = "201404150001" });
students.Add(new Student { StudentId = 2, Code = "L0002", Name = "Chetan Gujjar", EnrollmentNo = "201404150002" });
students.Add(new Student { StudentId = 3, Code = "L0003", Name = "Bhavin Patel", EnrollmentNo = "201404150003" });
return students;}

نتیجه ای که در View مورد انتظار است، به شکل زیر خواهد بود.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

راههای زیادی برای حل این مساله وجود دارد. به چند نمونه از این راه حلها خواهیم پرداخت .

1- استفاده از یک Dynamic Model

در دات نت فریم ورک 4 ، یک ExpandoObject افزوده شده که در یک NameScpace به نام System.Dynamic قرار دارد. با استفاده از یک Dynamic Object میتوان در Runtime یک Object تولید و یک یا بیش از یک Property به آن Add نمود. به پیاده سازی این روش دقت کنید.

  1. public ActionResult Index()  
  2. {  
  3.     ViewBag.Message = "Welcome to my demo!";  
  4.     dynamic mymodel = new ExpandoObject();  
  5.     mymodel.Teachers = GetTeachers();  
  6.     mymodel.Students = GetStudents();  
  7.     return View(mymodel);  
  8. }}  
 

ایراد این روش این است که باید Strongly Typed Model را فراموش نمایید .

  1. @using MultipleModelInOneView;  
  2. @model dynamic  
  3. @{  
  4.     ViewBag.Title = "Home Page";  
  5. }  
  6. <h2>@ViewBag.Message</h2>  
  7.   
  8. <p><b>Teacher List</b></p>  
  9.   
  10. <table>  
  11.     <tr>  
  12.         <th>Id</th>  
  13.         <th>Code</th>  
  14.         <th>Name</th>  
  15.     </tr>  
  16.     @foreach (Teacher teacher in Model.Teachers)  
  17.     {  
  18.         <tr>  
  19.             <td>@teacher.TeacherId</td>  
  20.             <td>@teacher.Code</td>  
  21.             <td>@teacher.Name</td>  
  22.         </tr>  
  23.     }  
  24. </table>  
  25.   
  26. <p><b>Student List</b></p>  
  27.   
  28. <table>  
  29.     <tr>  
  30.         <th>Id</th>  
  31.         <th>Code</th>  
  32.         <th>Name</th>  
  33.         <th>Enrollment No</th>  
  34.     </tr>  
  35.     @foreach (Student student in Model.Students)  
  36.     {  
  37.         <tr>  
  38.             <td>@student.StudentId</td>  
  39.             <td>@student.Code</td>  
  40.             <td>@student.Name</td>  
  41.             <td>@student.EnrollmentNo</td>  
  42.         </tr>  
  43.     }  
  44. </table>  
 

2- استفاده از ViewModel

این روش یکی از روشهای استاندارد و پیشنهاد شده در حال حاضر میباشد. در این روش یک کلاس حاوی Object هایی که آنها را در Model اصلی نیاز داریم ایجاد و سپس آنرا به صورت واسطه به View ارسال مینماییم. برای حل مساله در مثالی که مطرح کرده ایم ، به یک Viewmodel به شکل زیر نیاز داریم.

  1. public class ViewModel{  
  2.     public IEnumerable<Teacher> Teachers { getset; }  
  3.     public IEnumerable<Student> Students { getset; }  
  4. }  

 

حال وضعیت Action Method ما در Controller به شکل زیر خواهد شد.
  1. public ActionResult IndexViewModel(){  
  2.     ViewBag.Message = "Welcome to my demo!";  
  3.     ViewModel mymodel = new ViewModel();  
  4.     mymodel.Teachers = GetTeachers();  
  5.     mymodel.Students = GetStudents();  
  6.     return View(mymodel);}  
 

و حال باید Razor view به شکل زیر ایجاد گردد.

  1. @using MultipleModelInOneView;  
  2. @model ViewModel  
  3. @{ ViewBag.Title = "Home Page"; }  
  4. <h2> @ViewBag.Message </h2>  
  5. <p>  
  6.     <b> Teacher List </b >  
  7. </p>  
  8. <table>  
  9.     <tr>  
  10.         <th>Id</th>  
  11.         <th>Code </th>  
  12.         <th>Name</th>  
  13.     </tr>  
  14.     @foreach (Teacher teacher in Model.Teachers)  
  15.     {  
  16.         <tr>  
  17.             <td>@teacher.TeacherId</td>  
  18.             <td>@teacher.Code</td>  
  19.             <td>@teacher.Name</td>  
  20.         </tr>  
  21.     }  
  22. </table>  
  23.  <p><b>Student List</b></p>  
  24. <table>  
  25.     <tr>  
  26.         <th>Id</th>  
  27.         <th>Code</th>  
  28.         <th>Name</th>  
  29.         <th>Enrollment No</th>  
  30.     </tr>  
  31.     @foreach (Student student in Model.Students)  
  32.     {  
  33.         <tr>  
  34.             <td>@student.StudentId</td>  
  35.             <td>@student.Code</td>  
  36.             <td>@student.Name</td>  
  37.             <td>@student.EnrollmentNo</td>  
  38.         </tr>  
  39.     }  
  40. </table>  
 

چند روش دیگر هم وجود دارد که در قسمت بعدی به آنها اشاره خواهیم کرد.

 
علی کلاهدوزان
معرفی نویسنده : علی کلاهدوزان

سلام بر دوستان ،
شاید رایج است به عنوان پروفایل کاربر ، چند خطی راجع به خودم بنویسم ، ولی وضعیت کاری و سوابق من با یک جستجوی ساده در گوگل مشخص خواهد شد ، لذا سرتان را با مطالب بی مورد به درد نیاورم بهتر است . اگر نکته خاصی لازم بود بدانید در قسمت "ایلیا سافت در یک نگاه" به احتمال زیاد یافت خواهد شد . جزئیات بیشتر را سوال کنید ، آدرس ایمیل Ali@Kolahdoozan.com همیشه جوابگوی شماست .امیدوارم از مطالب سایت استفاده کرده باشید . شاد و پیروز باشید .

امتیاز به مطلب
           
برچسب ها
Razor View Multiple Model ASP.NET MVC 
نظرات کاربران
ارسال نظر