הוספה של User Control לעמוד.
במידה ואתם עובדים עם User Controls יש שתי דרכים להשתמש בהם בדפי ה - aspx שלנו.
דרך אחת להוסיף שורת Register בתחילת העמוד:
<%@ Register src="~/UserControl.ascx" tagname="UserControl" tagprefix="uc1" %>
דרך נוספת היא לרשום את ה - UserControl בקובץ ה - web.config, כך:
<system.web>
<pages>
<controls>
<add src="~/UserControl.ascx" tagName="UserControl" tagPrefix="uc1"/>
</controls>
</pages>
</system.web>
אני מעדיף את הדרך השנייה, מכיוון שזה חוסך לי להוסיף Register לכל עמוד.
הבעייה:
יש בעייה מוזרה במידה ורושמים את ה - UserControl בקובץ הקונפיג, וגם ה - User Control וקובץ הקונפיג נמצאים באותה תיקייה (כלומר ב - root) נקבל את השגיאה הבאה: (בהנחה של - UserControl קוראים UersControl.ascx ולדף קוראים WebForm1.aspx)
The page '/WebForm1.aspx' cannot use the user control '/UserControl.ascx', because it is registered in web.config and lives in the same directory as the page.
הפיתרון:
להעביר את ה - UserControl לתיקייה אחרת (נניח UC) ואז נכתוב:
<system.web>
<pages>
<controls>
<add src="~/UC/UserControl.ascx" tagName="UserControl" tagPrefix="uc1"/>
</controls>
</pages>
</system.web>
למה זה קורה ?
ההתנהגות הזאת לא נראית הגיונית בעליל, ולכן החלטתי לחפש מה הסיבה שזה קורה.
מציאת ההודעה בקוד:
ראשית, היה לי די ברור שהודעות השגיאה שאחנו מקבלים לא כתובים בתוך הקוד אלא הם Resources של ה - dll, ואכן מצאתי את המחרוזת של השגיאה בקובץ System.Web.resources ב - dll של System.Web, היות שמצאתי את ההודעה מצאתי כמובן גם את ה - key שנקרא Invalid_use_of_config_uc.
כעת הייתי צריך למצוא מי משתמש ב - key הזה, קצת חיפושים ב - reflector ומצאתי מחלקה שנקראת SR (כנראה String Resources) המכילה המון const כשכל אחד הוא key עבור Resources אחד.
מצאתי את ה - key שלי וניסיתי להפעיל עליו Analyse של ה - Reflector (קליק ימין), להפתעתי הוא לא מצא כלום, שזה כמובן לא הגיוני מכיון שמישהו משתמש ב - key הזה כדי לזרוק שגיאה.
איך מיקרוסופט זורקים שגיאות ?
החלטתי להסתכל איך מיקרוסופט זורקים שגיאות, די בקלות מצאתי מקום ובו היה כתוב (להפתעתי)
throw new ConfigurationErrorsException(SR.GetString("Space_attribute"));
כלומר הם לא משתמשים ב - const אלא כותבים בצורה hard code את שם ה - key, מה שהסביר כמובן למה לא מצאתי איפה משתמשים ב - key.
צעד ייאוש למציאת המקום aבו זורקים את השגיאה.
לא נשארה לי ברירה, לחצתי קליק ימין על ה - dll ובחרתי Export, ה - Reflector הנחמד יצר לי תייקיה עם כל המחלקות שקיימים ב - System.Web.dll (כלי נהדר - כבר אמרנו).
הפעלתי על התייקיה את החיפוש של Windows 7 עם המחרוזת, והוא מצא לי שיש מחלקה הנקראת MainTagNameToTypeMapper שמשתמשת ב - key הנ"ל, הסתכלתי על המימוש וכמובן היה כתוב בו את הקוד הבא: (חלק מהקוד)
if (ucRegisterEntry.ComesFromConfig && (ucRegisterEntry.UserControlSource.Parent == this._parser.BaseVirtualDir))
{
throw new HttpException(System.Web.SR.GetString("Invalid_use_of_config_uc", new object[]
{ this._parser.CurrentVirtualPath, ucRegisterEntry.UserControlSource }));
}
שכמובן מסביר למה השגיאה מתרחשת. עדיין נשארתי עם השאלה הפתוחה, למה הם עשו את זה, ובמידה שלמישהו יש תשובה - אשמח לשמוע על כך.