DCSIMG
שליטה בסקריפט שירוץ בלחצני ה - master page - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

שליטה בסקריפט שירוץ בלחצני ה - master page

 

קבלתי את הדרישה הבאה:
 
יש לנו master page שיש בו לחצן בשם back,
 
ברוב הדפים הוא אמור לקחת דף אחד אחורה,
בחלק מהדפים, הלחיצה עליו צריכה להפנות לדף בשם main.aspx,
ובדף מסוים שנפתח כדיאלוג, זה צריך לסגור אותו.
 
וכמובן שאם נרצה בעתיד להוסיף לדפים חדשים פעולות אחרות עבור הלחצן, שזה יהיה קל.
 
 
אז פיני, העלה רעיון מבריק. ומימש אותו בצורה הבאה:
 
 
שלב ראשון:
נגדיר enum עבור הפעולות האפשריות, מעל כל אפשרות, נוסיף attribute, שיכלול את הסקריפט,
הנה הקוד:
 

public class StringValueAttribute : Attribute

{

    private string m_Value;

 

 

    public StringValueAttribute(string value)

    {

        m_Value = value;

    }

 

    public string Value

    {

        get { return m_Value; }

    }

}

 

 

public enum ScriptActions

{

    [StringValue("window.close()")]

    WindowClose = 1,

 

    [StringValue("history.go(-1)")]

    GoBack = 2,

 

    [StringValue("window.location.assign('tasklist.aspx')")]

    GoToTaskList = 3,

 

    [StringValue("window.location.assign('Main.aspx')")]

    GoToMainPage = 4

 

}

 
 
שלב שני:
נכתוב מתודה שיודעת לאחזר מתוך instacne של ה enum את הערך של ה attribute
 

public class ScriptActionsRetrevier

{

    private ScriptActionsRetrevier()

    {

    }

 

    public static string GetStringValue(ScriptActions value)

    {

        string sRetVal = string.Empty;

        Type type = typeof(ScriptActions);

 

        //Look for our 'StringValueAttribute' in the field's custom attributes

        FieldInfo oFieldInfo = type.GetField(value.ToString());

        StringValueAttribute[] oStringValueAttributeARR =

            oFieldInfo.GetCustomAttributes(typeof(StringValueAttribute),

                false) as StringValueAttribute[];

 

        if (oStringValueAttributeARR.Length > 0)

        {

            sRetVal = oStringValueAttributeARR[0].Value;

        }

 

        return sRetVal;

    }

}

 
שלב שלישי:
כל הדפים שלנו יורשים מ PageBase, נוסיף שם את הקוד הבא:
 
 

public class PageBase : Page

{

    public virtual ScriptActions ScriptToRunOnBackButton

    {

        get

        {

            return ScriptActions.GoBack;

        }

    }

}

 

בכל דף שבו נרצה לשנות את אופציית ברירת המחדל (GoBack) נוכל לדרוס את המאפיין,
לדוגמא:
 

public partial class WebForm2 : PageBase

{

    public override ScriptActions ScriptToRunOnBackButton

    {

        get

        {

            return ScriptActions.WindowClose;

        }

    }

}

 
כעת ב master page נכתוב את הקוד הבא:
 
 

protected void Page_Load(object sender, EventArgs e)

{

    PageBase pageBase = this.Page as PageBase;

    if (pageBase != null)

    {

        string script = ScriptActionsRetrevier.GetStringValue

                            (pageBase.ScriptToRunOnBackButton);

 

        btnBack.Attributes.Add("onclick", script);

    }

}

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

תוכן התגובה

Pini Dayan כתב/ה:

ותודה לשלמה על הפידבק :-)

# April 12, 2009 8:14 AM

Avi Pinto כתב/ה:

רעיון נחמד, אבל לא הייתי משתמש במימוש של ה Attribute,

נראה לי מיותר.

מספיק ליצור class עם const-ים שמכילים את הסקריפטים השונים שתרצה להפעיל כמו:

public const string GO_BACK = "history.go(-1)"

ליצור את המאפיין הוירטואלי ב base שיאותחל ב GO_BACK

ולדרוס אותו אם צריך ביורשים

# April 14, 2009 1:14 AM

Shlomo כתב/ה:

יש משהו במה שאתה אומר

# April 14, 2009 1:50 AM

Yoav Michaeli כתב/ה:

נראה לי מיותר כל השימוש ב BasePage זה מחייב שינוי בכל הדפים.

יכול להיות שיהיה יותר נכון לחשוף את זה כיכולת של הMasterPage ע"י Interface או משהו כזה.

ואז בדפים הרלוונטים להוסיף פניה בPageLoad לשינוי תנהגות האב.

זה ידרוש פחות שינויים במערכת.

# July 29, 2009 10:11 AM

Shlomo כתב/ה:

הדבר הראשון שאני עושה בכל מערכת WEB זה לוודא שיש class בשם PageBase שכולם יורשים ממנו.

זהו אחד מהדברים הכי נכונים לעשות, זה גורם שתמיד נוכל לפתור בעיות במקום אחד.

הייתי גם במקומות שבו נוהגים לרשת מכל ה - Controls ולהשתמש רק בהם (גם אם עדיין לא עושים כלום - כדי שבעתיד אם נקצה לשנוף נניח איך נראה CheckBox השינוי יהיה רק במקום אחד)

# July 29, 2009 11:00 AM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 6 and 2 and type the answer here:


Enter the numbers above: