because it is registered in web.config and lives in the same directory as the page

3 בינואר 2011

2 תגובות



הוספה של 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>


 


 

 

למה זה קורה ?


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

 


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

 

מציאת ההודעה בקוד:


ראשית, היה לי די ברור שהודעות השגיאה שאחנו מקבלים לא כתובים בתוך הקוד אלא הם 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 }));


}


 


 

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

הוסף תגובה
facebook linkedin twitter email

להגיב על שמואל לבטל

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. שמואל4 בינואר 2011 ב 16:27

    וואלה,
    המון זמן לקח לי ללמוד לעבור לתת תיקייה, וסוף סוף אני מבין מאיפה זה בכלל מגיע…

    הגב
  2. שמואל15 בפברואר 2011 ב 14:19

    אחד הדברים המעצבנים ביותר
    במיוחד כשרוצים לשים אובייקט HTML כמו תמונת רקע על ה USER CONTROL, ואז אחרי שרואים שהכל עובד, צריך לזכור לתקן את את הURL לפי כתובת יחסית לתיקיית היעד [העמוד שיציג את הCONTROL]

    הגב