locked
עדכון נתונים ב-MVC3 RRS feed

  • שאלה

  • שלום!

    אני עובד עם mvc3.

    במהלך עבודתי אני צריך לשמור נתונים במסד הנתונים בשני אופנים: אוביקט יחיד ואוסף של אוביקטים.

    1. יש לי view שיושב על אוביקט (יחיד) מה-EF וחלק מהפקדים מקושרים למאפייני בן כמו: Person.Details.Name (יש אפילו דרגות יותר נמוכות יותר )

    הבעיה היא שכאשר אני שולח (ע"י: Html.ActionLink(" ", "Save", "ConrollerName", Model) l@)

    לפונקצית השמירה ב-Controller, אוביקטי הבן(Details) מגיעים ריקים (Null). איך אני יכול לבצע זאת?

    2. יש לי view המשתמש ב-webgrid והמודל שלו הוא אוסף אוביקטים ובו אני צריך לבצע שמירה אחת לכל האוסף (גם כנ"ל עם ה-ActionLink).

    א. האם בכלל מומלץ להשתמש ב-WebGrid?

    ב. איך אפשר להעביר את כל האוסף (כולל אוביקטי בן לכל אחד) ל-Controller?

    3.איפה אפשר למצוא חומר ודוגמאות על עבודה עם MVC3+EF , שליפה והזנה של נתונים בצורה קצת יותר מורכבת ?

    תודה מראש!

    ג'רי

    יום ראשון 22 אפריל 2012 07:36

תשובות

  • ברוב המקרים לא נוח לעבוד עם אובייקטים מורכבים (כאלו שמכילים תתי אובייקטים) בתוך התצוגות

    מציע לך לשקול לעבוד בשיטת ה-View Model (נקראת גם Presentation Model)

    בדרך זו אתה מגדיר מחלקה חדשה לגמרי העונה על הצרכים של התצוגה בלבד. המחלקה הינה שטוחה ומכילה את ה-DataAnnotation הרלוונטים. מחלקה זו משמשת לאינטראקציה עם התצוגה וזאת במקום האובייקט מתוך EF. ה-Controller אחראי למפות את השדות מתוך אובייקט ה-EF לאובייקט התצוגה (ובכיוון ההפוך). אני ממליץ להשתמש בספריה המצויינת AutoMapper לשם הגדרת המיפויים (ניתן להתקין מ-NuGet) וכך ניתן לשמור על הקוד ב-Controller כפשוט.

    דוגמא שעושה את מה שמסופר מעלה ניתן למצוא כאן

    • הוצע כתשובה על-ידי ipdd יום ראשון 29 אפריל 2012 11:55
    • סומן כתשובה על-ידי ג'רי יום ראשון 29 אפריל 2012 11:56
    יום רביעי 25 אפריל 2012 09:37
    מנחה דיון

כל התגובות

  • ברוב המקרים לא נוח לעבוד עם אובייקטים מורכבים (כאלו שמכילים תתי אובייקטים) בתוך התצוגות

    מציע לך לשקול לעבוד בשיטת ה-View Model (נקראת גם Presentation Model)

    בדרך זו אתה מגדיר מחלקה חדשה לגמרי העונה על הצרכים של התצוגה בלבד. המחלקה הינה שטוחה ומכילה את ה-DataAnnotation הרלוונטים. מחלקה זו משמשת לאינטראקציה עם התצוגה וזאת במקום האובייקט מתוך EF. ה-Controller אחראי למפות את השדות מתוך אובייקט ה-EF לאובייקט התצוגה (ובכיוון ההפוך). אני ממליץ להשתמש בספריה המצויינת AutoMapper לשם הגדרת המיפויים (ניתן להתקין מ-NuGet) וכך ניתן לשמור על הקוד ב-Controller כפשוט.

    דוגמא שעושה את מה שמסופר מעלה ניתן למצוא כאן

    • הוצע כתשובה על-ידי ipdd יום ראשון 29 אפריל 2012 11:55
    • סומן כתשובה על-ידי ג'רי יום ראשון 29 אפריל 2012 11:56
    יום רביעי 25 אפריל 2012 09:37
    מנחה דיון
  • תודה רבה!!!

    בשיטה הנ"ל איך כדאי לממש שדות שאמורים להבחר ב-DropDownList, האם ליצור שני מאפיינים (ב-ViewModel): עבור הרשימה למילוי ועבור השדה הנבחר? או שעדיפה שיטה אחרת?

    האם תוכל לפרט קצת על ה-AutoMapper? ומה התועלות שלו?

    ושוב - תודה רבה! התשובה שלך והדוגמא ממש עזרו לי!

    ג'רי


    ג'רי

    יום ראשון 29 אפריל 2012 11:32
  • ה-ViewModel אמור לספק את הצרכים של התצוגה. לכן אם ברצונך להציג רשימה של אפשרויות לבחירה וכן לאפשר למשתמש לבחור אחת מהן הייתי בהחלט בוחר באופציה שהצעת של שני שדות.

    AutoMapper הינה ספריה פשוטה המבוססת על קונבנציות. ברוב המקרים כאשר עובדים על מערכות Enterprise יש צורך להמיר אובייקטים מסוג אחד לסוג שני. הקוד שממיר את האובייקטים הוא לרוב קוד "משעמם" ולא מתוחכם אך דורש זמן. AutoMapper מנסה לעזור בזה ע"י קונבציות. כלומר, בהינתן שני אובייקטים AutoMapper תעתיק את כל השדות מאחד לשני בהתאם לשמות שלהם. מיפויים נדרשים ש-AutoMapper לא יודעת להבין אנו משלימים בקוד Custom משלנו. הרעיון הוא שיש לנו מקום אחד מרכזי המחזיק את כל המידע על המיפויים ואנו משתמשים בו איפה שצריך.

    עוד מידע על AutoMapper אפשר למצוא כאן

    יום ראשון 29 אפריל 2012 12:18
    מנחה דיון
  • שלום.

    ראה כאן:

    http://automapper.org/

    https://github.com/AutoMapper/AutoMapper/wiki/Getting-started


    בהצלחה, ואם עזרתי, לחץ על 'סמן כתשובה', וסמן את התשובה כמועילה.

    יום ראשון 29 אפריל 2012 12:26
  • תודה רבה!!!!

    התשובות שלך עזרו לי מאד!

    נשארה לי עוד בעיה עם ה-View שיושב על אוסף ומוצג ב-WebGid:

    אני צריך לבצע שמירה אחת לכל האוסף.

    כרגע האוסף מגיע לשרת null אלא אם כן אני מחליף את הקוד ל-table במקום ה-Webgrid,

    אז, השדות שמגיעים עם ערכים הם רק השדות שמוגדרים להם פקדים כמו:Html.TextBoxFor (ואפילו לא html.TextBox)

    ויוצא שיש לי לדוגמא שדה מסוג bool? שאני רוצה להציגו בפקד CheckBox ואין לי אפשרות בפקד מסוג CheckBoxFor כיון שהוא מקבל רק שדה מסוג bool,

    אם אני משתמש בפונקציות/מאפיינים כמו: Value  או בפקד Html.CheckBox הערך מגיע לשרת null.

    א. האם מומלץ לעבוד עם ה-webgrid? אם לא, עם מה כן?

    ב. איך אפשר להתמודד עם הבעיה המתוארת בשמירה?

    תודה מראש!!!


    ג'רי

    יום שני 30 אפריל 2012 12:18
  • מה הכונה "שמירה אחת לכל האוסף"?

    אם אתה מעוניין בפעולות מתקדמות בתוך ה-Grid מומלץ לשקול שימוש ב-Grids אחרים. היתרון ב-WebGrid זה שהוא חינמי אך מצד שני לוקה בחסר לגבי Features מסויימים

    כדאי לך לבחון את ה-Grids הבאים:

    1. Telerik
    2. Infragistics
    3. jqGrid

    שלושתם דרך אגב לא חינמיים ...

    יום שלישי 01 מאי 2012 21:50
    מנחה דיון
  • "שמירה אחת לכל האוסף" - הכוונה היא שאני צריך  בגישה אחת לשרת לשמור את כל השינויים שבוצעו במסך ולא שמירה נפרדת לכל שורה.

    אין לי אפשרות כרגע להשתמש ב-Grid לא חינמי ולכן אני משתמש ב-webgrid.

    יש אפשרות לבצע זאת?

    תודה מראש!


    ג'רי

    יום רביעי 02 מאי 2012 06:47