en-UShe-IL
You are here:   Blog
Register   |  Login

Blog Archive:

Maximize
* Can be used in order to search for older blogs Entries

Search in blogs


Blog Categories:

Maximize
* Can be used in order to search for blogs Entries by Categories

Blog Tags:

Maximize
* Can be used in order to search for blogs by keywords

TNWikiSummit


Awared MVP

 


Microsoft® Community Contributor 


Microsoft® Community Contributor


 Read this before you use the blog! Maximize

Recent Entries

Minimize
מרץ3

Written by: ronen ariely
03/03/2012 23:43 RssIcon

לפני מספר ימים העלתי לרשת מדריך קצר בנושא מימוש שליטה על תרבות Culture בפיתוח בטכנולוגיית MVC תוך שימוש בשורת הכתובת לקביעת התרבות בה הגולש רוצה לעבוד.

כך למשל גולש שרוצה לגלוש באנגלית יכנס לכתוב:
http://localhost:56795/en-US/Home/Index
וגולש שרוצה להיכנס לאותה כתובת בעברית יכנס לכתובת:
http://localhost:56795/he-IL/Home/Index

ז"א בנינו לנו כתובת בעלת המבנה:
domain/Culture/controller/Action?parameters
במקום הכתובת המובנית בברירת המחדל של MVC מהצורה:
domain/controller/Action?parameters

שינוי זה בכתובת של הראוטר מעלה כמה דברים שעלינו לבצע בהמשך העבודה. לכן מדריך זה מצד אחד מהווה המשך של המדריך הקודם לגבי מימוש Culture בכתובת ה URL ומצד שני יכול לשמש את כל מי שמבצע שינויים בכתובת המובנית בראוטר ומוסיף לה פרמטרים נוספים. נראה כיצד נוכל לממש את השימוש בכתובת שקבענו המבוססת על הראוטר באפליקציה עצמה.

נתחיל מהצגת כמה בעיות ונציג פתרונות בהתאם. מדריך זה יהיה דינאמי ואם אקבל פניות נוספות או אחשוב על בעיות נוספותל שיכולות לעלות או לעניין אוסיף אותם בהמשך

נתחיל אם כן בהכנת פרוייקט חדש ונממש את השימוש בכתובת URL בהתאם למדריך הקודם:
http://ariely.info/Blog/tabid/83/EntryId/75/Culture-Implementation-in-MVC.aspx

הבעיה

לאחר שמימשנו את השמוש בכתובת URL שונה אנו רוצים לעשות שימוש באזור המוגבל בכניסה רק למשתמשים רשומים. בשלב הראשון הגדרנו Role חדש בשם Adnibistrator ועתה נעשה שימוש ב Atribute הבא באחד הקונטרולים שלנו:

[Authorize(Roles = "Administrator")] 

התוצאה היא שכל פעם שמשתמש שעדיין אל התחבר למערכת יכנס לכתובת של הקונטרול הוא יועבר לעמוד של ההתחברות בו עליו יהיה להכניס שם משתמש וססמה. אבל כאן מתחילה הבעיה. נניח שאנחנו נכנסים לדוגמה לכתובת:
http://localhost:56795/he-IL/StoreManager

המשתמש יועבר לכתובת:
http://localhost:56795/Account/LogOn?ReturnUrl=%2fhe-IL%2fStoreManager

ז"א אם תשימו לב בכתובת שהוא מועבר נעלם לנו החלק של ה URL שהוספנו ואשר מגדיר לנו את ה Culture של המשתמש

הפתרון

1. בקובץ הקונפיגורציה web.config נמצא את המיקום בו מוגדר להיכן להעביר אותנו. חפשו את השורה:

<forms loginUrl="~/Account/LogOn" timeout="2880" /> 

נחליף את השם LogOn בקישור בבשם Login כפי שנראה כאן:

<forms loginUrl="~/Account/Login" timeout="2880" /> 

2. נפתח את הקונטרול של המשתמשים שלנו לשם הוספת הקוד עבור ה Action החדש שהגדרנו על ידי הוספת הקוד הבא:

[LocalizationAuthorizeAttribute]
public ActionResult Login()
{
    return View();
}

3. נגדיר את ה Atribute החדש שלנו:

יצרו קובץ מחלקה חדשה בשם LocalizationAuthorizeAttribute והכניסו את הקוד הבא:

public class LocalizationAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
 
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }
 
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            String language    = (String)filterContext.RouteData.Values["language"];
            String culture     = (String)filterContext.RouteData.Values["culture"];
            String QStr        = filterContext.HttpContext.Request.QueryString.ToString();
            String StrReferrer =  filterContext.HttpContext.Request.UrlReferrer.PathAndQuery;
 
            CultureInfo OldCulture = new CultureInfo(String.Format("{0}-{1}", language, culture));
            try
            {
                if (!String.IsNullOrEmpty(StrReferrer.Split('/')[1]))
                    OldCulture = new CultureInfo(StrReferrer.Split('/')[1]);
            }
            catch { }
 
            String loginUrl = String.Format("~/{0}/Account/LogOn?{1}", OldCulture, QStr);
 
            filterContext.Result = new RedirectResult(loginUrl);
        }
    }
}

בצורה זו למעשה ביצענו Override לברירת המחדל והגדרנו קישור שלנו. כמובן שניתן לכתוב כל קישור שרוצים.

הערה: עלי לציין בנקודה זו שהפתרון המופיע כאן עושה שימוש בפירוק של הכתובת ממנה אנו מגיעים על ידי ביצוע SPLIT. אישית אני לא פעול בצורה זו במערכות חיות בדרך כלל מכיוון ששיטה זו מגבילה אותנו למבנה מסויים של שרשרת הקישור. היה ומחר מישהו יחליט להוסיף הגדרה של ראוטר בקובץ ה global.asax אז יהיה עלינו להיכנס שוב להגדרות המופיעות כאן ולהגדיר בדיקות ופירסור של השרשרת כך שתכסה גם את האפשרות החדשה. הדרך היותר גמישה היא לבנות מחלקה נפרדת המכילה מתודה לפירסור כל כתובת URL לפי אוסף הגדרות ה ראוטר שיש לנו.