
{controller}, {action} ו-{id}, וממילים קבועות ביניהם.comp או printer ונתב לפעולה Electronics, ונתיב אחר קיבל מוצרי הלבשה ונתב לפעולה Wear. ערך שאינו מתאים לאף נתיב גורם לשגיאת 404.*, כל מה שאחריו נכנס לפרמטר אחד, גם אם יש בו לוכסנים.axd. ה-IgnoreRoute חייב להיות הראשון ברשימה.הטקסט המלא של הדקות הראשונות בהרצאה «הגדרת נתיבים - Routes» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לנושא מאוד חשוב ומאוד מעניין שנקרא ראוטס. ראוטס זה הנתיב שהמשתמש רושם בשורת ה-URL בדפדפן שלו, ועל ידי הנתיב הזה הוא גולש ישירות לאקשן, כלומר לפונקציה שנמצאת בקונטרולר ספציפי.
ואנחנו יכולים לשלוט על המון דברים בנתיב הזה ולכוון אותו בדיוק לקונטרולר שאנחנו רוצים ולפונקציה שאנחנו רוצים בתוך הקונטרולר. בואו נראה דוגמה.
יש לנו כרגע קונטרולר שאנחנו מוסיפים, עבור מוצרים, נקרא לו products. עכשיו אנחנו ראינו שישנה פונקציה אוטומטית שנקראת אינדקס, אנחנו לא חייבים שהיא תהיה, אנחנו יכולים למחוק אותה, אבל זאת הפונקציה הדיפולטית שיש.
בואו נצרף view, ונגדיר שה-view הזה הוא עבור המוצרים, product. אוקיי, עכשיו אם אנחנו מבצעים גלישה לאתר, אנחנו רואים קודם כל שב-default ה-URL שהמשתמש גלש אליו זה ה-URL של האתר, כרגע זה נמצא ב-localhost, ובאמצעות זה איזשהו URL שקיים בכתובת מסוימת.
המספר הזה שאנחנו רואים כאן זה איזשהו פורט ש-MVC נתנה לנו, כלומר Visual Studio נתנה לנו, וזה מדמה בעצם את התיקייה הראשית של האתר. וכל הזמן אנחנו ראינו שבעצם אנחנו לא רואים שום דף אם אנחנו גולשים סתם לתיקיית האתר, אלא רק אם אנחנו נציין איזשהו קונטרולר ספציפי, לדוגמה פרודקס, אז אנחנו נצליח לגלוש לקונטרולר.
אם קיימת שם פונקציית אינדקס ספציפית במילה אינדקס, תכף אנחנו נראה למה השם אינדקס קיים, אז אנחנו נקבל את ה-view שהפונקציה הזאת חושפת.
אנחנו כמובן יכולים לבצע גלישה ספציפית לפונקציה כזאת או אחרת בצורה כזאת. אבל איפה זה מוגדר שאינדקס זה הפונקציה הדיפולטית, ואיפה מוגדר שבכלל אין קונטרולר דיפולטי או שיש קונטרולר אחר?
אז בואו נסגור את הדפדפן, תחת תיקייה אפ סטארט ומאתר בה קובץ שנקרא routes.config כאן אנחנו רואים שישנה מחלקה שנקראת routes.config והיא אחראית על ההגדרות של כל ה-routes שאנחנו יכולים להרשות למשתמש לגלוש אליהם.
יש לנו פונקציה ש-MVC אוטומטית מוציאה אותה לפועל שנקראת Register Routes. היא מקבלת קולקשן של ראוט ובמהלך הפונקציה אנחנו מוסיפים לקולקשן כל מיני הגדרות של נתיבים שהם חוקיים מבחינת המשתמש.
להגדרה הזאת אנחנו נגיע בהמשך. כרגע אנחנו מסתכלים על ההגדרה הזאת שמתארת map route ספציפי. map route אומר אנחנו מגדירים איזשהו נתיב שהמשתמש יכול לגלוש אליו.
כאשר אנחנו מגדירים map route יש לנו מספר הגדרות שאנחנו צריכים לתת לפונקציה. הגדרה ראשונה זה איזשהו שם שאנחנו נותנים לנתיב שאנחנו יוצרים כאן, בהגדרה של הנתיב.
השם הזה יכול להיות כל שם שאנחנו רוצים, העיקר שהוא לא יחזור על עצמו בהגדרות נוספות שאנחנו הולכים להגדיר. אז בי דיפולט יש לנו איזשהו ראוט שנקרא דיפולט.
הדבר השני שמוגדר בפונקציה mapRout זה מה ה-URL שהוא חוקי מבחינת גלישת המשתמש. כל ה-URLים האלה שנכתבים כאן הם תמיד יחסיים לתיקייה הראשית של האתר. אף פעם אנחנו לא נתחיל URL בטילדה ואף פעם אנחנו לא נתחיל url ב-slash אבל מה מוגדר בתוך ה-url?
בתוך ה-url יש סך הכל שני חלקים שמהם מורכב ה-url. חלק אחד נקרא placeholder, החלק הזה מוגדר בעזרת סוגריים מסולסלות וזה מתאר שיש פה שומר מקום שאחר כך מתייחסים אליו בהמשך.
לדוגמה כאן אנחנו רואים שיש התייחסות לשומר מקום הזה, קונטרולר. החלק הנוסף שיש כאן זה כל מיני סימנים או אותיות שמותר לנו להשתמש בהם, שזה לא placeholder, אלא זה משהו שהלקוח יהיה חייב לכתוב.
זאת אומרת, שמה שמוגדר כאן זה שלושה placeholders, אנחנו רואים אחד controller, אחד action ואחד ID, וביניהם שני סימנים של סלאש.
ואלה שני החלקים שמורכב ה-URL. מה זה אומר ה-placeholder? ה-URL, סליחה, המשתמש חייב להכניס כאן איזשהו שם ואז סלאש ואז עוד שם ואז סלאש והמערכת אוטומטית תנתב את השמות האלה למה שמוגדר בהמשך.
אם לא מוגדר שום דבר אז אוטומטית היא תיקח את מה שמוגדר בדיפולט. זה החלק השלישי. הדיפולט מציין מה בעצם אמור להיות החלקים האלה אם המשתמש לא הכניס כלום.
ואנחנו רואים שאם המשתמש לא הכניס שום דבר ב-URL אלא גלש ישירות לתקייה של האתר אז אנחנו רואים ש-MVC בהגדרה הזאת תנסה לחפש קונטרולר שנקרא home. כלומר, היא תשלים את הקונטרולר שהמשתמש הכניס, זו המילה home, action index, ו-id לא חובה להכניס, זה אופציונל.
אופציונל, פרמטר אופציונלי. אז בעצם יש לנו כאן את השם שאנחנו מגדירים שהוא חייב להיות ייחודי, יש לנו url שהפורמט הזה, זה אומר שהמשתמש חייב לרשום.
כלומר, המשתמש חייב לרשום איזושהי מילה, סלאש, מילה, סלאש ועוד מילה, ואם הוא לא רושם שום מילה בסלאש האחרון מבחינת המערכת זה default.
ואז אם הוא לא רשם שום דבר באחד מהם, אז אוטומטית יש לנו את ה-default שהמערכת מכניסה. אין לנו קונטרולר שנקרא home, יש לנו קונטרולר שנקרא products.
לכן בואו נרשום בקונטרולר products. במידה והמשתמש לא יכניס שום קונטרולר, אוטומטית mvc תחפש קונטרולר שנקרא products. בואו נריץ, ואנחנו רואים שלמרות שלא רשמנו שום דבר, אנחנו אוטומטית הגענו לא רק לקונטרולר שנקרא product אלא גם לאקשן שנקראת אינדקס.
זאת הסיבה דרך אגב שתמיד לא רשמנו את השם של האקשן ואוטומטית אינדקס זאת הפונקציה הראשונה שקיבלנו. אז אנחנו רואים שקודם כל by default אפשר להגדיר איזשהו נתיב defaulty שאם המשתמש לא רושם כלום אוטומטית mvc תביא לו איזושהי אקשן מסוימת שקיימת באיזשהו קונטרולר מסוים.
עכשיו מה עוד אנחנו יכולים לעשות עם הנושא של הראוץ ואיזה עוד ראוץ אנחנו יכולים להגדיר. אז לצורך ההדגמה בואו נחזור לקונטרולר ונבנה עוד אקשן, נקרא לה details אבל הפעם היא תקבל איזשהו ID ואנחנו רוצים להביא מהדאטאבייס את המוצר עם ה-ID שהתקבל ולהחזיר אותו כמובן דרך ה-view ללקוח.
אז לצורך הדוגמה מה שנעשה זה נשתמש ב-view bag בשביל להגדיר לו product ID שווה ל-ID שהתקבל לפונקציה ונייצר איזשהו View. נוסיף View עבור Details וב-View Details כל מה שנעשה נגדיר Details for Product ID ונשלב פה את ה-Product ID.
יש לנו את ה-ViewBag. נקודה Product ID. בואו נראה אם לקוח יכול לגלוש ישירות לפונקציה Details מבחינת ה-Routes שקיימים לנו.
פונקציה Details מקבלת איזשהו אינטג'ר שנקרא ID. נחזור ל-routed config ונסתכל מה קורה אם הלקוח גולש בדיוק לפונקציית אינדקס ושולח לה ID. אז אם הוא גולש לפונקציית אינדקס הוא חייב לתת קודם כל את הקונטרולר ואז אם זה קונטרולר אחר כמובן שהוא לא יהיה פרודקט, הוא יכול לתת כל קונטרולר שהוא רוצה.
אקשן כמובן הוא ירשום details וזה כמובן מחליף את האינדקס והוא יכול לספק ID וזה יחליף את האופשנל פרמטר שיש פה וה-ID אכן יתקבל לתוך הפונקציה.
זאת אומרת שהראוט הזה שקיים כאן מתאים גם למצב שבו לקוח גולש לפונקציה details. בואו נריץ את האתר. אוטומטית אנחנו רואים שהמערכת גלשה לאינדקס של הפרודקטס, אבל הפעם אנחנו נגלוש לפרודקטס ולפונקציה details וניתן לה את ה-ID 100.
אנחנו רואים שהצלחנו להגיע ישירות לפונקציה details עם ה-ID 100, ועשינו פה הדמיה כאילו ניגשנו לדאטאבייס והבאנו את המידע והצגנו אותו.
מה היה קורה אם היינו גולשים לפונקציה details ולא היינו מספקים שום ID? ואנחנו רואים שיש פה איזושהי בעיה שהמערכת לא הצליחה לקחת את המחרוזת הריקה, או נעל יותר נכון, ולהפוך אותו ל-in32 שזה אינטג'ר.
הסיבה שהיא לא הצליחה זה בפני שהנתיב הזה קובע לגלוש ישירות לפונקציה details שנמצאת ב-controller products.
בגלל שלקוח לא סיפק לנו ID אז אנחנו רואים כאן שה-ID יכול להיות אופציונלי ולכן במצב שאין ID אוטומטית mvc שמה בו null. אם mvc שמה בו null אנחנו לא יכולים להמיר אותו ל-ID שקיים פה, אלא אם כן אנחנו נגדיר סימן שאלה.
אם סימן שאלה מציין שהוא יכול גם לקבל null. למה כעת אנחנו נבצע את ההרצה ונגלוש לאותו הנתיב "Products" בואו נעשה קודם כל Details עם 100 ולאחר מכן Details בלי כלום. אנחנו רואים ש-MVC לא הרימה לנו Exception אלא אפשרה לגלוש מפני שהצליחה לקחת את ה-NID שקיים פה במילים אחרות Null ולהכניס לתוך ה-ID הזה ואז שמנו פה פשוט Null ב-Product ID ב-View
Bag. בדרך כלל אנחנו לא נרצה לבצע דבר כזה, אם אנחנו רוצים להציג איזשהו מוצר אנחנו נגיד למשתמש שהוא חייב לתת לנו איזשהו שם או יותר נכון ID של מוצר בשביל להציג אותו.
אבל מה היה קורה אם הייתה לנו פונקציה שמקבלת מספר פרמטרים? האם ראוט כמו שהגדרנו שם יתאים לה? אז בואו נבנה פונקציה שמחזירה Action Result, כלומר View, ומציינת הזמנה של מוצר, Order.
אנחנו רוצים לראות את כל המוצרים שהוזמנו בתאריך מסוים, אז בואו נניח שהפונקציה של order תקבל int year, int month, int day.
הפונקציה תייצר איזושהי מחרוזת משלושת הפרמטרים, או אפילו תיקח את שלושתם בצורה נפרדת ותכניס ל-viewBag, רק בכדי לראות שאנחנו מצליחים לקבל אותם כמו שצריך ולהציג אותם ב-view.
viewBag.month, viewBag.day, ונחזיר view בשביל לראות את המידע. נצרף view שנקרא order ונגדיר בדיוק באיזה תאריכים או באיזה תאריך אנחנו הולכים לראות את כל המוצרים.
אז יש לנו כאן span של year, נגדיר כאן את ה-view-bag year, יש לנו month ויש לנו day. אם לקוח גולש לפונקציה order הוא כמובן חייב לספק לנו שלושה ערכים, אבל איך בדיוק הוא אמור לספק לנו את שלושת הערכים?
הרי אנחנו ראינו שאם לקוח גולש הוא רושם לנו את שם ה-controller, את שם ה-action שהוא רוצה, לדוגמה order ואז יש לו אפשרות לרשום עוד פרמטר אחד ויחיד.
אם כרגע הוא ירשום איזשהו פרמטר אחד ויחיד לדוגמה שנת 2000 אנחנו נראה ש-MVC לא מצליחה להפוך את שני הערכים האחרים ל-Integer כי היא אכן מנסה לגלוש ל-Controller Products ל-Action Order אבל היא לא מצליחה לקחת את שני הערכים האחרים שחסרים לה לומר Month ו-Day ולהכניס אותם בתוך המשתנים.
רק את ה-year היא הצליחה. אנחנו צריכים עכשיו להגדיר שניתן יהיה לקבל שלושה משתנים ולהכניס אותם ל-year, month ו-day. הרי אם אנחנו ננסה להכניס עכשיו עוד שני משתנים, לדוגמה חודש, השמיני ויום מספר 3, אנחנו נראה בכלל שיש שגיאה אחרת.
השגיאה הזאת מגיעה מ-IIS והיא מציינת שבכלל היא לא הצליחה לאתר איזשהו קונטרולר או איזשהו איזושהי אקשן שניתן להכניס את הראוט הזה אליה ואכן לא מוגדר לנו ראוט כזה.
אז אנחנו כאן צריכים ללכת ולהגדיר עוד ראוט ואנחנו הולכים לראוט קונפיג ואנחנו צריכים בראוט קונפיג להגדיר עוד ראוט ספציפית עבור הסוג שדיברנו עליו. אז נבצע העתקה והדבקה, ניתן לו שם לדוגמה order ונגדיר לראוט הזה מבנה אחר. נגדיר לראוט שאם המשתמש גולש לפרודקטס קונטרולר מסוים, בואו אפילו נרשום פה
שהוא חייב לגלוש ספציפית לפרודקטס, שם הוא גולש ספציפית לפונקציה שנקראת אורדר, וכאן הוא חייב לספק שלושה ערכים: עיר, ובואו אפילו נראה שאנחנו יכולים כל מיני סימנים אחרים לתת במקום סלאש, מאנס ודיי. זאת אומרת שהגדרנו ראוט נוסף ושונה
שמשתמש יכול לרשום, והראוט הזה ינותב ספציפית לאן שנגיד לו. אם המשתמש לא רושם כלום, אנחנו רוצים שזה יהיה Products, Action Order, EAR חייב להיות הערך שנמצא בתוך EAR, MONTH חייב להיות הערך שנמצא בתוך MONTH ו-DAY חייב להיות הערך שנמצא בתוך ה-Place Holder, שומר המקום,
DAY. אוקיי, עכשיו הגדרנו את הראוט החדש הזה, בואו נראה אם הלקוח מצליח לגלוש אליו ולקבל את הנתונים.
אז יש לנו את הדפדפן, ואנחנו עכשיו מנסים לגלוש לproducts orders ושם לתת שנת 2000 מינוס חודש מינוס יום