ABA


"MVC 4, העברת מספר מודלים ל view page,"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10955 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10955
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   09:16   17.10.12   
אל הפורום  
  MVC 4, העברת מספר מודלים ל view page,  
 
   האם אפשרי להעביר 2 מודלים לעמוד תצוגה?
נניח ויש לי DB, ובעצם ביצעתי query של 2 רשימות מידע שונות.
את שתי הרשימות אני רוצה להציג בעמוד התצוגה.

איך ניתן להעביר 2 מודלים?
קוד לדוגמא:


public ViewResult Index()
{
return View(db.Movies.ToList(),db.Songs.ToList());
}

ואז בעמוד התצוגה איך אני מגדיר model נוסף? אני נתקל בבעיה כי model היא מילה שמורה, ואני לא יכול להגדיר model2 לצורך העניין.

@model IEnumerable<MyTest.Models.Movie>
@model2 IEnumerable<MyTest.Models.Songs>

חשבתי נגיד ליצור class שמכיל את 2 הרשימות כמאפיינים
ואז בעצם לעשות fetching לכל רשימה בנפרד.
אבל אני רוצה להמנע מזה כי זה יוצא שאני כותב class יעודי לתצוגה, זה נראה לי דבילי, לא?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  מכתב Frozen_Prince  17.10.12 15:23 1
     תודה על התגובה, dvir8 17.10.12 15:42 2
         מכתב Frozen_Prince  17.10.12 16:06 3
             תודה רבה על התגובה אחי! dvir8 18.10.12 08:20 4
                 בכיף, איפה אתה עובד? מחפשים עובדים? (: Frozen_Prince  21.10.12 12:53 5
                     חברת ''חשבים''. dvir8 22.10.12 08:21 6

       
Frozen_Prince 
חבר מתאריך 11.5.06
5341 הודעות
   15:23   17.10.12   
אל הפורום  
  1. מכתב  
בתגובה להודעה מספר 0
 
אני אענה ואשלול את מה שרשמת במשפט האחרון שלך, כי ההפך הוא הנכון,
בעולם הקליינט, לכל View יש ViewModel, שהוא בעצם Model שמיוצג בJavaScript ומייצג את כל האינפורמציה על העמוד.

אותו דבר בMVC, לא רק שאתה צריך לבנות קלאס חדש המייצג בעצם את הViewModel שלך.

ממש לא נכון להשתמש באותו אובייקט שאתה שולף מהDB, כמודל לVIEW.

נכון שברוב הדוגמאות Microsoft אוהבת לשים את הקלאסים של ה-Entity Framework בתיקיית Models ואת המודלים האלה הם שולחים ל-View, אבל בעולם האמיתי כשתתחיל לבנות אפליקציות, תראה שזה ממש לא ככה.

יהיה לך פרוייקט נפרד, שמייצג את האובייקטים של הDB שלך, ויהיה לך את פרוייקט הMVC, שתיקיית המודלים שלו תכיל ViewModels בלבד. שהם בעצם מודלים דלים שמכילים רק מידע שמעניין את ה-VIEW ולא להעמיס על המידע מהשרת לקליינט.

לדוגמא: נניח והמודל Movie שלך מכיל בDB שדות כמו "Internal ID" "External ID" "Is Hidden" "Date Modified" וכו'...

שדות אלה למשל, לא רלוונטיים לתצוגה, ולא תרצה לשלוח אותם סתם לVIEW, כי מידע שווה זמן העברת נתונים, וטעינת דף איטית יותר, לכן תיצור ViewModel בתיקיית Models, שמייצג רק את השדות הרלוונטיים לView.

בקונטרולר שלך אתה תקרא לאובייקט מהDB, תיקח את השדות הרלוונטיים מהאוביייקט ותכניס אותם לאובייקט חדש מסוג ה-ViewModel שיצרת.

מקווה ששפכתי לך קצת אור על התמונה הכללית


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   15:42   17.10.12   
אל הפורום  
  2. תודה על התגובה,  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 17.10.12 בשעה 15:45 בברכה, dvir8
 
יש לי כמה שאלות מנגד.

מה שאמרת לגבי ה id לא סותר.
הרי אתה מושך את האובייקט ומבצע LINQ לשדות שאתה רוצה לקבל לתוך רשימה.
את הרשימה אתה מעביר ולא את המודל, ככה שחסכת בהעברת הנתונים בכל מקרה,
ולאחר מכן מציג את הרשימה ב VIEW.

השאלה שלי היא נגיד ויש לי טבלה של סרטים ב DB, וטבלה של שירים.
יש לי class Movie ויש לי class Songs המשקף כל טבלה ב DB כך שניתן לבצע binding.

המשתמש ניגש למסך החיפוש.
אני רוצה להציג למשתמש שתי רשימות מתוכם יחפש שיר מסוים מתוך סרט מסוים.
לשם כך אני צריך להעביר ל View, שתי רשימות שונות.

אני יכול ליצור class General שיכיל אובייקט של movies ואובייקט של songs.
ואז בעצם להעביר את אובייקט של מחלקה זו למודל (כמובן לאחר LINQ שאבצע)
כך שאמשוך רק שמות ללא ID.

ואז אעביר את הרשימה ל view ואגש לשדות בצורה של item.movies.name (דוגמא)

השאלה אם זו הדרך הנכונה? או שיש דרך אחרת, טובה יותר לעשות זאת?


שאלה נוספת,
לגבי מה שרשמת שיהיה לי פרוייקט נפרד שמייצג את ה DB.
למה כדאי לפתוח פרוייקט נפרד בשביל זה?

שאלה נוספת,
מתי עדיף לי להחזיר ViewResult ומתי עדיף להחזיר ActionResult?
למה למשל לא להשתמש תמיד ב ActionResult?

*יכול להיות שאני מדבר המון שטויות, ואשמח אם תתקן אותי.
התחלתי ללמוד את הנושא אתמול

תודה רבה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Frozen_Prince 
חבר מתאריך 11.5.06
5341 הודעות
   16:06   17.10.12   
אל הפורום  
  3. מכתב  
בתגובה להודעה מספר 2
 
"השאלה אם זו הדרך הנכונה? או שיש דרך אחרת, טובה יותר לעשות זאת?"
זאת הדרך הנכונה

"לגבי מה שרשמת שיהיה לי פרוייקט נפרד שמייצג את ה DB.
למה כדאי לפתוח פרוייקט נפרד בשביל זה?"

כי שוב בעולם האמיתי יהיו לך המון Entities (ישויות של דאטאבייס) שא. לא תמיד תרצה את כולם בפרוייקט הWEB שלך, וב. יכול להיות שיהיו לך אפליקציות נוספות שישתמשו באותן הEntities.

לדוגמא, תרצה בנוסף ליצור תוכנת WinForms, או WebService שתוכל לעדכן איתו את הDB, ללא שימוש באתר שלך. ככה, יהיה לך כבר את הפרוייקט מוכן כDLL לשימוש ע"י אפליקציות אחרות. וכשתעשה שינוי בפרוייקט הזה, כל האפליקציות יקבלו את השינויים האלה, במקום ליצור את הEntities האלה בכל פרוייקט בנפרד, ואז כל שינוי תצטרך לבצע בכל הפרוייקטים.
ושוב למען הסדר הטוב, תיקיית ה-Models בפרוייקט הMVC שלך לא צריכה לכלול אובייקטים של DB, כמו שאתה רוצה בדוגמאות, היא צריכה להכיל Modelים רזים שמייצגים מידע שאתה רוצה להציג בView מסויים, ורק בעולם וורוד הם יהיו אחד לאחד כמו המודלים של הDB.

"מתי עדיף לי להחזיר ViewResult ומתי עדיף להחזיר ActionResult?
למה למשל לא להשתמש תמיד ב ActionResult?"

ViewResult יורש מActionResul, לכן כשאתה מצהיר שהמתודה מחזירה ActionResult ואתה מבצע Return View(); אז זה תקין.

נהוג להשתמש ב-ActionResult מכיוון שחוץ מ-ViewResult, אתה יכול להחזיר המון יורשים אחרים כמו: JsonResult, FileResult וכו'... כולם יורשים מ-ActionResult ולא דורשים ממך להצהיר אחרת בראש הפונקציה.
מתקדם בלבד(אם אתה לא מבין דלג על הפסקה הזאת): מה גם שאם תרצה לעשות Override למתודות של קונרולר ממנו ירשת, בדרך כלל המתודות האלה יחזירו ActionResult ושוב יאפשרו לך לשחק עם הערך המוחזר (ViewResult, JsonResult, FileResult).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   08:20   18.10.12   
אל הפורום  
  4. תודה רבה על התגובה אחי!  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Frozen_Prince 
חבר מתאריך 11.5.06
5341 הודעות
   12:53   21.10.12   
אל הפורום  
  5. בכיף, איפה אתה עובד? מחפשים עובדים? (:  
בתגובה להודעה מספר 4
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות
   08:21   22.10.12   
אל הפורום  
  6. חברת ''חשבים''.  
בתגובה להודעה מספר 5
 
   יכול להיות שמחפשים. לא בטוח.
זה בשבילך?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net