DCSIMG
because it is registered in web.config and lives in the same directory as the page - שלמה גולדברג (הרב דוטנט)

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

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

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

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

}

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

תוכן התגובה

שמואל כתב/ה:

וואלה,

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

# January 4, 2011 4:27 PM

שמואל כתב/ה:

אחד הדברים המעצבנים ביותר

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

# February 15, 2011 2:19 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 6 and 6 and type the answer here:


Enter the numbers above: