שליטה בסקריפט שירוץ בלחצני ה - 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 ערך חדש, ובדף שנרצה, נדרוס את המאפיין.
תוכלו להוריד
מכאן פרויקט דוגמא.