September 2009 - Posts
בתפוז נשאלה השאלה הבאה:
איך אפשר לגרום ל - WebClient לשלוח בקשה עם Encoding של 1255 ולא utf8.
בהתחלה מישהו אמר שאפשר להשתמש במאפיין Encoding - כלומר הקוד הבא:
WebClient client = new WebClient();
client.Encoding = Encoding.GetEncoding(1255);
string str = client.DownloadString(http://www.google.co.il);
משום מה זה לא עבד - מעיון קצר ב - Reflector מסתבר שהמאפיין הזה משפיע אך ורק על תרגום הבתים שחוזרים מהבקשה, כלומר מאחורי הקלעים מפעילים את המתודה DownloadByte וכדי לדעת באיזה Encoding לתרגם את התוצאה משתמשים במאפיין Encoding - כלומר אין שום קשר בין ההגדרה של המאפיין לבין שליחת ה - Request ב - Encoding הרצוי.
הנה חלק מהקוד שרץ עבור DownloadString
try
{
WebRequest request;
byte[] bytes = this.DownloadDataInternal(address, out request);
string retValue = this.GuessDownloadEncoding(request).GetString(bytes);
}
בשורה השנייה הם מורידים מערך של בתים ויוצרים את ה - Request ובשורה הבאה הם מחזירים string לפי ה - encoding שבחרנו.
אז כדי לקבוע את ה - Encoding שבה נרצה לשלוח את ה - request צריך להשתמש ב - headers בצורה הבאה:
WebClient client = new WebClient();
client.Headers.Add(HttpRequestHeader.ContentType, "charset=windows-1255");
string str = client.DownloadString(http://www.google.co.il);
ואז למעשה ה - request ישלח ב - encoding הרצוי
בליל יום כיפור התרחש הדבר הנורא מכל שהיינו יכולים לחשוב עליו - מורי ורבי האדמו"ר מלעלוב זצוק"ל נפטר לעולמו והשאיר אותנו יתומים ואבלים, ואין מה שינחם אותנו באבלנו.
בתמונה רואים את האדמו"ר זצוק"ל מחלק עוגת דבש בערב יום כיפור ומאחל גמר חתימה טובה לחסידיו - ואני לא אוכל לעולם לסלוח לעצמי על שפיספתי את ההזדמנות ההאחרונה לראות ולהתברך מפי הצדיק.
האדמו"ר היה כאבא לחסידיו כל חסיד וחסיד מרגיש שהרבי הינו האבא הפרטי שלו, בכל שאלה קלה כחמורה אנו יודעים שיש לנו את מי לשאול - וכעת אנו מרגישים כיתומים וכספינה שאבד קרבניטה.
אספר כאן כמה סיפורים בודדים שלא יוכלו לתאר את גדולתו וקדושתו של הרבי, אבל אולי יצליחו להעביר עד כמה אנו קשורים ומקושרים ברבי.
כשאשתי הייתה בהריון לפני שנתיים, עשתה אישתי סקירת מערכות - הרבי היה תמיד אומר שלא לעשות את הבדיקה הזאת - אשתי שכחה ועשתה, בבדיקה התגלה שיש לעובר נקודה בלב, הטכנאי אמר שנראה בדחיפות את הצילומים לרופא,
כמובן שכחסיד התקשרתי לרבי וספרתי לו מה שאמר הטכנאי, הרבי התרעם עלי מדוע עשינו את הבדיקה - ואמר לי שלדעתו לא כדאי שנראה את הצילומים לרופא.
אשתי הייתה מאוד לא רגועה ורצתה להראות בכל זאת את הצילומים לרופא, התקשרתי לרבי ואמרתי לו שאשתי לא רגועה - הוא אמר לי שאם אנחנו מאוד רוצים אנחנו יכולים להראות לרופא,
כעבור חמש דקות קבלתי טלפון מהרבי - והוא אומר לי, "אני מרגיש שלא כדאי שתראו לרופא את הצילומים ואני אומר לכם שהכל יהיה בסדר" כמובן שלא הראנו את הצילומים לרופא וברוך השם אשתי ילדה בת בריאה ושלמה.
סיפור שני שברצוני לספר - הרבי שנא מחלוקת בכל מאודו הוא לא יכל לסבול כשהוא ראה או שמע על מחלוקת בין שני יהודים, לפני קרוב לעשור כשהרבי היה בחו"ל פרצה מחלוקת בין כמה חסידים, הרבי התקשר לאבי ובקש ממנו להגיד לאותם אנשים בשמו שיפסיקו את המחלוקת, אבי אמר לרבי שהם לא יקשיבו לו, אמר לו הרבי תגיד להם שאו שהם משלימים או שאני סוגר את הבית כנסת על מנעול ומפסיק להיות הרבי שלכם.
סיפור שלישי ששמעתי אתמול (מפי השמועה) הרבי היה מתגורר חלק גדול מהשנה בצפת - עקב האסטמה - בתקופה האחרונה הרבי נסע יחד עם יהודי בשם אברהם לגבול לבנון - שם הסתובב דבוק במחשבותיו במשך כמה שעות (החיילים שאלו מי זה - וענו להם שזה האדמו"ר מלעלוב) סיפור זה קרה שלושה פעמים - בכל פעם התברר בבוקר שהחיזבאללה ניסה לפגוע בחיילי צה"ל וברוך השם זממם לא הצליח.
סיפור אחרון (שאני מכיר את המעורבים באופן אישי) עורך דין ידוע בבני ברק שראייתו הלכה ונחלשה, הרופאים אמרו לו שתוך כמה חודשים הוא יהיה עיוור ואין מה לעשות, הרבי אמר לו לבוא איתו לפולין בז' שבט (הרבי נהג לערוך נסיעה פעם בשנה לקברי אבותיו) אותו עורך דין הגיע ומייד לאחר שחזר לארץ חזרה אליו ראייתו באורח פלא, סיפור נוסף על חבר שלא היה לו ילדים שבע שנים והרופאים התיאשו ואמרו שחבל על הזמן ולא יהיה להם ילדים, כשהרבי שמע זאת הוא אמר, "לרופאים ניתנה הרשות לרפאות אבל לא לייאש - הרבי אמר לו שיפסיקו את כל הטיפולים והוא מבטיח להם בן תוך שנה" - וכך היה.
יש אין סוף סיפורים על ישועות ומופתים אבל הנקודה היא שאנחנו מרגישים שאבד לנו אבינו - ואין לנו מנחם.
סיפר הגבאי שראה אותו פעם אחרונה לפני שנפטר - שלראשונה בחייו אחרי שקרא הרבי קריאת שמע לא הכין לעצמו נטילת ידיים למחרת.
מי יתן לנו תמורתו.
החלטתי לכתוב פוסט לבלוגר המתחיל, לפחות עד שבאמת יקימו את הבלוג/פורום – הסיבה שהחלטתי לכתוב את הפוסט היא בגלל שהגיע חבר חדש לקהילת הבלוגרים שמו Genady אני לא מכיר אותו (עדיין) אישית, אני מכיר אותו מהפורומים של תפוז הוא אחד מהעונים בקביעות ולפי התשובות שלו שם רואים שיש לו הרבה ידע, נקווה שכולנו נהנה מהפוסטים שלו, בכל מקרה עזרתי לו קצת בצעדים הראשונים כאן, וחשבתי לכתוב פוסט שיסכם את כל מה שבלוגר מתחיל צריך לדעת.
אז אם אתה (הקורא) בלוגר מתחיל - מקווה שהפוסט הזה יעזור לך לתועלת כולנו.
תוכן ענינים:
· למי לפנות כשמסתבכים.
· איפה כותבים.
· עברית – אנגלית.
· קטעי קוד.
· איך לתייג.
· מקורות נוספים.
למי לפנות כשמסתבכים:
אופציה שנייה אפשר לפנות למיכל v-mgonen@microsoft.com, (וכאן המקום להודות למיכל על כל העזרה, לא משנה מה הייתי צריך אני תמיד מקבל תשובה מהירה ויעילה, מרגישים שמיכל שמחה לעזור.)
איפה כותבים:
למעשה יש שני דרכים (שאני מכיר) לכתוב פוסטים. הראשון הוא באמצעות ה – LiveWriter, איך להתחיל לעבוד איתו תוכלו לקרוא כאן.
הדרך השנייה היא כמובן לכתוב באתר – אחרי שעושים SignIn אפשר להכנס ל – ControlPanel לבחור ב – MyBlogs תחת Common Tasks אפשר ללחוץ על Write a Blog Post.
עברית - אנגלית:
תחת Global Settings תוכלו לבחור ב – Change How My Blog Looks ולבחור סקין שימצא חן בעיניכם – יש סקינים לעברית וסקינים לאנגלית.
כמובן שבהרבה מקרים אתם רוצים בפוסט אחד לכתוב גם בעברית וגם באנגלית, אם תשוטטו בבלוגיה תגלו הרבה דיונים על הנושא, אני אנסה לתמצת את הפיתרונות.
בגדול הברירה היחידה היא להתערב בקוד ה – HTML של הפוסט, נניח שהבלוג שלכם בעברית ואתם רוצים לכתוב קטע באנגלית (לדוגמא קטע קוד), מה שצריך לעשות זה לעבור לתצוגת html – (ב – LiveWirter זה Shift + F11 – ומי שכתב באתר, יש לחצן html שפותח חלון נפרד עם ה – html) צריך להוסיף את המקטע הבא - <div dir=ltr align=left> לכתוב את מה שתרצו באנגלית ולזכור לסגור את ה – div – כמובן שצריך לזכור כשרוצים לחזור לעברית לכתוב <div dir=rtl align=right>.
מי שכותב באתר ולא מעוניין לכתוב לבד html מוזמן להשתמש ב –Addin שכתבתי עבור IE שעושה את זה אוטומטי. לכל הפרטים, כאן.
ל – AddIn עבור LiveWriter, כאן
קטעי קוד:
כדי להעתיק קטעי קוד מתוך ה – Visual Studio אל הפוסט שלכם, יש AddIn נהדר שנקרא Copy Source As Html – שכשמו כן הוא – יודע להעתיק קטע קוד נבחר ל – html מה שיישאר לכם לעשות זה רק להדביק את ה – html – אפשר להוריד את זה מכאן ולקרוא על זה כאן, וכאן.
אופציה שנייה – ותודה רבה לשחר - זה Plugin Collection for Windows Live Writer ואפשר להוריד מכאן
איך לתייג:
תוכלו לתייג את הפוסטים שלכם בכל תגית שרק תרצו, אבל קיים חמשה תגים לשובים שישפיעו באיזה חלק (אם בכלל) הפוסט שלכם יופיע בדף הבית – לקריאה נוספת בבלוג של מיכל - כאן (הפוסט הוא ישן – אבל המידע עדכני – נכון להיום)
מקורות נוספים:
במידה ואתם חושבים שיש עוד נקודות שצריך לכתוב (ואני בטוח שיש) אשמח לקבל הערות על הפוסט ולעדכן אותו בהתאם.
אני משתמש די בקביעות עם שני extensions ל - string, וחשבתי לשתף אותם.
הראשון: בדיקה האם מחרוזת אינה null או ריקה בדרך כלל מתבצעת בצורה הבאה
string str;
if (!string.IsNullOrEmpty(str))
{
}
היה הרבה יותר נחמד לולא היינו יכולים לשאול על ה - str - אבל מה לעשות שאולי ה - str הינו null (וזה שאלה מכשילה).
השני: המרה ממחרוזת ל - enum מתבצעת בדרך כלל ככה:
enum NyEnum
{
One,
Two
}
NyEnum data = (NyEnum)Enum.Parse(typeof(NyEnum), "One");
ולכן כתבתי את המחלקה הבאה:
namespace System
{
public static class StringExtension
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
public static T ToEnum<T>(this string value) where T : struct
{
return (T)Enum.Parse(typeof(T), value);
}
}
}
הסיבה שבחרתי להשתמש ב - namespace של System - היא כדי שבכל האפליקציה שלי יהיה לי את התוספת ל - string ללא צורך לעשות using מיוחד בכל קובץ.
כעת לבדוק האם יש ערך במחרוזת יראה כך:
string str;
if (!str.IsNullOrEmpty())
{
}
ולהמיר ל - enum יראה כך:
MyEnum data = "One".ToEnum<MyEnum>();
והקוד שלנו יהיה הרבה יותר קריא.
בתפוז עלתה שאלה, כיצד לקבל מימדים של תמונה שהמקור שלה הוא handler ממערך של בתים.
לדוגמא, נניח שזה קוד ה - html
<asp:Image ImageUrl="~/Handler1.ashx" ID="myImg" runat="server" />
הנה קוד ה - handler
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/bmp";
byte[] array = File.ReadAllBytes(@"c:\IMG_1181.jpg");
context.Response.OutputStream.Write(array, 0, array.Length);
}
כעת אנחנו רוצים לדעת מה המימדים של התמונה.
הבעייה טמונה בהתנהגות של בקשות לשרת - למעשה התמונה myImg לא תקבל את התמונה במחזור החיים של הדף, כלומר לא הדף אחראי לתת לאובייקט התמונה את התמונה, אלא אחרי שהדף ירד ללקוח תתבצע עוד Request אל השרת כדי לקבל את התמונה מה - handler, ולכן אנחנו לא יכולים לדעת את מימדי התמונה בזמן מחזור החיים של הדף.
כדי לקבל בכל זאת את המימדים, נועל לעשות את זה או בצד הלקוח - או בצד השרת אבל רק ב- handler.
בצד הלקוח זה מאוד פשוט, לדוגמא:
<input type="button" value="ShowHeight" onclick="alert(myImg.height)" />
כמובן שאפשר לשלוח את הנתון ב - ajax לשרת.
בצד השרת (ב - handler) אפשר לכתוב את הקוד הבא:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/bmp";
byte[] array = File.ReadAllBytes(@"c:\IMG_1181.jpg");
MemoryStream ms = new MemoryStream(array);
System.Drawing.Image img = Image.FromStream(ms);
int height = img.Height;
context.Response.OutputStream.Write(array, 0, array.Length);
}
עמית לעבודה שאל אותי האם כשמגדירים nullable זה יושב ב - stack או ב - heap,
בהתחלה עניתי בלי לחשוב שזה יושב ב - heap, אבל אז חשבנו שזה לא הגיוני כי אם זה יושב ב - heap אז מה כל החכמה בזה ?
ואז הסתכלנו וראינו ש - nullable הוא למעשה struct ולא class, מה שאומר שהגדרה של ?int תשב ב - stack.
ואז שאלנו את עצמנו איך יכול להיות שאפשר לתת את הערך null או לבדוק האם מופע של nullable הוא null.
חקרנו קצת בעזרת ה - reflector ועלינו על הממצאים הבאים:
אין ולא יכול להיות הערך null במופע של nullable, מה שקורה באמת זה מספר טריקים של הקומפיילר.
1. השמה לתוך nullable
למעשה מתרגמת לקריאה של בנאי ברירת המחדל של struct ובמילים אחרות ב - IL אין זכר להשמה של הערך null לתוך j. יש קריאה פשואה לבנאי של nullable שנותן את הערך false למשתנה hasValue.
2. בדיקה האם nullable שווה ל - null - מתרגמת לקריאה של המאפיין HasValue, כלומר הקומפיילר יודע להמיר את הבדיקה:
ל -
וזה כל הטריק
לפעמים כשמדבגים מאוד נוח להכניס מחרוזות ל - trace/console.
בקיצר כתבתי את הקוד הבא:
Console.WriteLine("myObj == null " + myObj == null);
להפתעתי זה הדפיס רק את הערך false ללא המחרוזת: myObj == null. (גם כשהערך היה אמור להחזיר את התוצאה true)
לאחר קצת מחשבה נזכרתי שהאופרטור + הוא לפני אופרטור ההשוואה - כלומר - מה שקרה זה הדבר הבא:
חיבור של המחרוזת myObj == null למשתנה myObj ואת התוצאה השוונו ל - null, מה שתמיד החזיר את הערך false.
כמובן שאחרי ההבנה הקוד שנכתב היה -
Console.WriteLine("myObj == null " + (myObj == null));
בתפוז עלתה שאלה, כיצד ניתן לייצר validator עבור כל פריט ב - ListView בנפרד - כלומר נניח שיש לנו ListView שמציג תיבת טקסט ולחצן בכל שורה, במידה ונוסיף Validator לא נוכל להגיע לשרת במידה ואחד מתיבות הטקסט יהיה ריק.
כדי לפתור את זה אנחנו חייבים לתת לכל Validator ולחצן ValidatorGropu שונה מהאחרים, וזה יראה ככה.
<asp:ListView ID="lv" runat="server">
<ItemTemplate>
<tr style="">
<td>
<asp:TextBox ID="txt" runat="server" Text='<%# Eval("City") %>' />
<asp:RequiredFieldValidator ID="rfv" runat="server" ControlToValidate="txt"
ValidationGroup='<%#Eval("City") %>' ErrorMessage="*"></asp:RequiredFieldValidator>
</td>
<td>
<asp:Button ID="btn" ValidationGroup='<%#Eval("City") %>' runat="server" Text="update"
OnClick="btn_click" />
</td>
</tr>
</ItemTemplate>
<LayoutTemplate>
<table id="itemPlaceholderContainer" runat="server" border="0" style="">
<tr runat="server" style="">
<th runat="server">
Id
</th>
<th>
Update
</th>
</tr>
<tr id="itemPlaceholder" runat="server">
</tr>
</table>
</LayoutTemplate>
</asp:ListView>
ולמעשה גרמנו לזה שלכל שורה יהיה ValidationGropu לבד
הבעייה ידועה.
יש לכם דף שיש בו UpdatePanel עשיתם שינויים בעמוד, עברתם לדף אחר וחזרתם ע"י לחצן Back של הדפדפן כל השנויים שעשיתם נעלמו והדף חזר למצבו ההתחלתי, לעומת זאת אם לא היה UpdatePanel בדף ועברתם לדף אחר כשתחזרו ע"י Back כל השינויים ישמרו.
ב - IE8 יש לזה פיתרון מובנה - אבל זה עניין לפוסט אחר, כאן אני רוצה להראות טריק מעניין שיכול לעזור לפתור את הבעייה.
דוגמא לבעייה:
נניח שיש לי Grid על העמוד כברירת מחדל הוא עולה ריק ויש DropDown - שבזמן שהוא משתנה ה - grid מקושר למידע מתאים.
קוד ה - html
<asp:ScriptManager ID="sm" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="udp" runat="server">
<ContentTemplate>
<asp:GridView ID="gv" runat="server">
</asp:GridView>
<asp:DropDownList ID="ddl" runat="server" AutoPostBack="true"
OnSelectedIndexChanged="ddl_SelectedIndexChanged">
<asp:ListItem Text="Select" Value="0"></asp:ListItem>
<asp:ListItem Text="City" Value="1"></asp:ListItem>
<asp:ListItem Text="Street" Value="2"></asp:ListItem>
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="Button1" Text="Redirect" runat="server" OnClick="Button1_Click" />
קוד שמתבצע בזמן שינוי ערך ב - DropDown
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
if (ddl.SelectedValue == "1")
{
DataTable table = new DataTable();
table.Columns.Add(ddl.Text);
table.Rows.Add("בני ברק");
table.Rows.Add("תל אביב");
table.Rows.Add("ירושלים");
gv.DataSource = table;
gv.DataBind();
}
else if(ddl.SelectedValue == "2")
{
DataTable table = new DataTable();
table.Columns.Add(ddl.Text);
table.Rows.Add("הרצל");
table.Rows.Add("רבי עקיבא");
table.Rows.Add("ז'בוטינסקי");
gv.DataSource = table;
gv.DataBind();
}
}
כשנשנה את ה - DropDown נקבל ערכים מתאימים ב - Grid.
הבעייה מתחילה כשאנחנו לוחצים על הלחצן Redirect - הנה הקוד שלו
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
כשנלחץ back בדפדפן נקבל Grid ריק. במידה ולא היה לנו UpdatePanel - לחצן ה - back היה זוכר את המצב של ה - grid.
הפיתרון שהשתמשתי בו היה כזה.
1. הוספת HiddeField שיחזיק את הסטטוס מהיכן הגענו, האם הדף נטען מהשרת או מההיסטוריה של הדפדפן.
2. בהנחה שיש לנו את המידע, בזמן onload (בצד ה - JS) נבדוק האם הגענו מההיסטורייה של הדפדפן, במידה וכן, נלך לשרת ונדאג שימלא את הנתונים מחדש.
מימוש:
הוספת HiddenField
<asp:HiddenField ID="hidStatus" runat="server" />
בפונקציית Page_Load נכתוב ל - hidden שהגענו מצד השרת
protected void Page_Load(object sender, EventArgs e)
{
hidStatus.Value = "server";
}
נוסיף קוד ללחצן Redirect שינקה את הערך של ה - hidState
<asp:Button ID="Button1" Text="Redirect" runat="server"
OnClick="Button1_Click" OnClientClick="ResetHid()" />
function ResetHid() {
var hid = document.getElementById('<%=hidStatus.ClientID %>');
hid.value = '';
}
נוסיף לחצן (מוסתר) שנוכל ללחוץ עליו אם נגלה שהגענו מה - back
<asp:Button ID="HidButton" runat="server" OnClick="HidButton_Click"
style="visibility:hidden" />
נכתוב ב - body קריאה לפונקציה
<body onload="CallBack()">
function CallBack() {
var hid = document.getElementById('<%=hidStatus.ClientID %>');
if (hid.value != 'server') {
document.getElementById('<%=HidButton.ClientID %>').click();
}
}
בשרת בזמן שינוי של ה - DropDown נשמור ב - Session את מה שנבחר
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
Session["ddl"] = ddl.SelectedValue;
והנה הקוד של הלחצן המוסתר.
protected void HidButton_Click(object sender, EventArgs e)
{
if (Session["ddl"] != null)
{
ddl.SelectedValue = Session["ddl"].ToString();
ddl_SelectedIndexChanged(sender, e);
}
}
(סתם התעצלתי להוציא את הקוד שמתבצע בזמן שינוי ב - DropDown לפונקציה - ולכן קראתי ישירות לאירוע).
בגדול זה יכול לפתור לנו את הבעייה.
אז לסיכום - מה שצריך לעשות זה את הדברים הבאים.
1. HiddenField שמאותחל לערך 'server כשהדף נטען מהשרת.
2. כל פעם לפני שיוצאים מהדף למחוק את הערך מאותו HiddenField.
3. ב onload של ה - body לבדוק האם הגענו מהשרת או מההיסטוריה.
4. במידה והגענו מההיסטוריה - להפעיל מתודה בשרת שתדע לאחזר את הנתונים.
אני מקווה שבקרוב נעלה גם את כל המצגות עם ה - Demo's של ההרצאות.
תהנו.
כמו ששמתם לב (אני מקווה) התחלתי לעבוד (ועדיין בתהליך) על שינוי המראה של הבלוג.
זה עדיין לא מושלם, וזה לא עובד כמו שצריך בדפדפנים אחרים.
הערות יתקבלו בברכה.
אז ההרצאה שלי עברה בשלום (אני מקווה) ממש התרגשתי לקראת ההרצאה, כי זה פעם ראשונה שאני מרצה לפני קהל גדול כך כך.
אני נהניתי ואני מקווה שכל השומעים נהנו.
מחר בעזרת השם אנחנו נעלה את כל ההרצאות לאינטרנט, בתקווה שיהיה לנו גם את כל המצגות וה - Demos של המרצים ונעלה את זה גם לאתר.
את
הפוסט האחרון שלי ניסיתי להעלות כמה פעמים, כל פעם שהייתי לוחץ על publish הייתי עובר לדף שגיאה עם התמונה הבאה
יצרתי קשר עם
מיכל (היא תמיד נמצאת כדי לעזור)
אחרי כמה נסיונות ותהיות הבנתי שהבעייה הייתה באחד התמונות שבמאפיין Image Description (כלומר alt) כתבתי בטעות odal> במקום Modal
וזה מה שקרם לבלוג להשתגע קצת.
בעייה שהעסיקה אותי הרבה זמן.
יש לי חלון אחד שפותח חלון שני במצב מודלי (בעזרת showModalDialog)
החלון השני עושה PostBack לשרת - כשהוא גומר החלון (המודלי) נפתח בחלון חדש.
לדוגמא:
החלון הראשון:
<form id="form1" runat="server">
<input type="button" value="Open Dialog"
onclick="showModalDialog('WebForm3.aspx')" />
</form>
החלון השני:
<form id="form1" runat="server">
<asp:Button ID="btn" Text="Button" runat="server"
OnClick="btn_Click" />
</form>
לפני הלחיצה על הלחצן בחלן המודלי, זה נראה ככה:
אחרי הלחיצה על Button בחלון המודלי, זה נראה ככה:
כדי לפתור את זה מצאתי רעיון ממש גאוני
כאן:
או להוסיף בחלון המודלי בתוך ה - head את השורה הבאה:
או לכתוב בחלון המודלי את הדבר הבא:
<script language="javascript">window.name = "modal";</script>
<form id="form1" runat="server" target="modal">
השם ב - target לא כל כך משנה - העיקר שהוא יהיה אותו שם שנתנו לחלון לפני טעינת הטופס.
כל אחת משני הדרכים יגרמו שאחרי PostBack החלון שיפתח לא יפתח בחלון חדש אלא נשאר בחלון המודלי.
בהמשך
לפוסט שהדגמתי איך לייצר ספק חיפוש (שמחפש בקורסים של סלע).
כתבתי גם מאיץ חיפוש.
אפשר להתקין את הספק והמאיץ
מכאן (ויסלחו לי מייקרוסופט שהעתקתי את העיצוב של הדף)
אז מה זה בעצם מאיץ ?
מומלץ לקרוא ב -
MSDN, בקצרה המשמעות של זה היא אפשרות לפנות לדף אחר או לשירות כלשהו עם פרמטרים מתוף הדף הנוכחי מבלי לגלוש לשם.
לדוגמא המאיץ שכתבתי לסלע - עושה את הדבר הבא.
בזמן שיטוט
בטבלת הקורסים שלנו אפשר ללחוץ קליק ימני על אחד הלינקים, לבחור במאיץ Details from Sela Syllabus ויפתח חלון תצוגה מקדימה עם תיאור הקורס.
איך עושים את זה - אני לא אסביר כאן את כל האפשרויות שיש במאיץ - (בפוסט אחר) אני רק אסביר במה אני השתמשתי.
שלב ראשון כתבתי את קובץ ה - xml שנראה ככה:
<?xml version="1.0" encoding="utf-8" ?>
<os:openServiceDescription
xmlns:os="http://www.microsoft.com/schemas/openservicedescription/1.0">
<os:homepageUrl>http://www.sela.co.il</os:homepageUrl>
<os:display>
<os:name>Details from Sela Syllabus</os:name>
</os:display>
<os:activity category="Learning">
<os:activityAction context="link">
<os:preview action="http://www.sela.co.il/SSP/SyllabusDetails.aspx?url={link}"></os:preview>
<os:execute action="http://www.sela.co.il/SSP/RedirectToSyllabus.aspx" method="get">
<os:parameter name="url" value="{link}" type="text"></os:parameter>
</os:execute>
</os:activityAction >
</os:activity>
</os:openServiceDescription>
נעבור על האלמנטים החשובים:
name: השם של המאיץ כפי שיוצג ב - Context Menu (יכול להיות רק אחד כזה)
activityAction context=link: בכללי ניתן לבחור שהמאיץ יהיה זמין כשבוחרים טקסט או על לינק או בכל הדף.
preview: מפעיל שירות כלשהו בזמן השהיית העכבר על המאיץ כשניתן לשלוח כל מיני פרמטרים, במקרה שלנו בחרתי לשלוח את הלינק עצמו.
execute: הגדרה מה לעשות בזמן לחיצה על המאיץ.
נראה את הדף SyllabusDetails (שכאמור אליו פונים בזמן preview)
<div class="Container">
<span class="lbl">Description:</span><br />
<div class="Content">
<span id="spanContent" runat="server"></span>
</div>
</div>
נתעלם מה - css, ונראה את קוד השרת.
protected void Page_Load(object sender, EventArgs e)
{
string url = Request["url"];
if (!string.IsNullOrEmpty(url))
{
url = GlobalObject.unescape(url);
if (url.Contains("?"))
{
url = url.Split('?')[1];
}
NameValueCollection nvc = HttpUtility.ParseQueryString(url);
string courseCode = nvc["CourseCode"];
if (!string.IsNullOrEmpty(courseCode))
{
if (Cache[courseCode] == null)
{
InsertInCache(courseCode);
}
spanContent.InnerText = Cache[courseCode].ToString();
}
}
}
ננסה להוציא את הפרמטר url (שכזכור מכיל את המשתנה link (ב - xml)
נשלוף מתוכו את שם הקורס.
נבדוק האם הוא קיים במטמון, במידה ולא נשלוף מבסיס הנתונים ונכניס למטמון.
נכתוב את התוצאות על הדף.
קל ופשוט.
More Posts
Next page »