Valid XHTML & ASP.NET
על XHTML, מה זה, ומי בכלל צריך את זה?
אם שמתם לב, בשנים האחרונות יש את נושא התקנים שצץ לו באינטרנט. אתם בטח תוהים, מה לעזאזל אני צריך את התקנים האלו, ולמה אנשים ממציאים כל מיני תקנים לא ברורים?
לאחר הופעתו של ה - WWW יצאו לשוק כל מיני תוכנות מוזרות הנקראות "דפדפנים", מטרתן של תוכנות אלו הייתה לאפשר גישה ל - Web, עם כל האפשרויות שהוא מציג, בין אם תוכן, בין אם תצוגה וכיו"ב.
כאן התחילה מלחמת הדפדפנים. בזמנו שני הדפדפנים העיקריים היו Netscape ו - IE, וע"מ למשוך גולשים, המפתחים של הדפדפנים "המציאו" כל מיני תוספות לדפדפנים, ולשפות שמשתמשים בהן (בינהן HTML, CSS ו - JavaScript).
מה שנוצר בעצם, שלכל דפדפן יש את ה"שגעונות" שלו, וכל אחד קורא איך שמתחשק לו, משתמש בתוספות שהקצו רק לו, ומנסה להיות הדפדפן הכי טוב.
הבעיה העיקרית ב - HTML, היא שניתן לכתוב קוד HTML בכל צורה, והדפדפן ירנדר אותו, גם אם הוא כתוב לא נכון. אין מושג כזה "שגיאה" ב - HTML.
כיום כששוק הדפדפנים רחב יותר, למפתחי האתרים יש בעיה ליצור אתר שיעבוד על דפדפנים רבים. לכן בא הארגון שנקרא W3C והחליט כי הוא מוציא תקנים. התקנים האלו יחליטו על התגיות שיהיו בשפת ה - HTML, ועל CSS, ואיך כל אלמנט צריך להתרנדר בהתאם למפרט שהם סיפקו.
למידע נוסף על התקנים, ניתן לעיין באתר הישראלי הכללים ובאתר של W3C.
אז מה ל - ASP.NET ול - XHTML (או "למה לעזאזל אני קורא/ת את הפוסט הזה")?
כפי שכולנו שמנו לב, יש ב - ASP.NET פקדים, הפקדים האלו הם בעצם אלמנטים שמתרנדרים לקוד HTML בסופו של דבר (מתי שהמשתמש הלחיט להכנס לאתרינו).
מכוח האינטרנט והתקדמות הטכנולוגיה, ASP.NET מרנדרת את דפי האתר עפ"י התקנים של XHTML (ברירת המחדל היא XHTML 1.0 Transitional).
XHTML הן ראשי תיבות של eXtensible HyperText Markup Language, זוהי שפת עיצוב ("גרסה חדשה" של HTML) שתחבירה מושפע מהתחביר של XML (לדוגמה, כל התגיות חייבות להסגר).
המממ... אז אם ASP.NET מרנדר את דפינו לפי התקן, מה הבעיה?
הבעיה צצה כשאנחנו רוצים לעבוד עם מפרטים חדשים יותר או שונים (לדוגמה XHTML 1.1).
סביר להניח שלא מעט אנשים שבודקים את הדפים שלהם בוואלידטור שמו לב לתופעה הבאה,
הבדיקות לא עוברות, מכיוון שהתגית form מקבלת את המאפיין name, שאינו חוקי.
הא?
מסתבר שכן, עפ"י XHTML 1.0 Strict ו - XHTML 1.1. דפי ה - ASP.NET מרונדרים, כפי שכבר אמרנו, עפ"י המפרט של XHTML 1.0 Transitional. שזוהי בעצם גרסה יותר "סלחנית" ע"מ לבצע את המעבר.
לכן ניתן להגיע למסקנה כי העמל הרב, העבודה והזיעה שהשקענו ע"מ שהדבר המזורגג הזה שנקרא Validator יגיד לנו "כן! כן! זה תקין! הידד!", ירדו לטימיון.
או שלא?
פה נכנס לתמונה הקובץ המוזר הזה שנקרא Web.Config, שלמזלנו נותן לנו לקנפג את האפליקציה שלנו בכל מיני צורות ודרכים.
Microsoft הוסיפה תגית חדשה (ב - ASP.NET 2, למיטב ידעתי בגרסאות הקודמות היא אינה קיימת), הנקראת xhtmlConformance.
לתגית הזו יש מאפיין פשוט הנקרא mode, והוא בעצם קובע לנו את אופן הרינדור של הדפים שלנו, ולו יש שלושה אפשרויות:
-
Legacy
-
Strict
-
Transitional
האפשרות הראשונה, קובעת כי האפליקציה לא תרנדר את הדפים עפ"י תקן ה - XHTML.
האפשרות השניה קובעת כי הדפים ירונדרו עפ"י XHTML 1.0 Strict, מה שיגרום לדפים שלנו לעמוד בתקן גם ב - Strict וגם ב - 1.1.
והאשפרות השלישית היא הברירת מחדל (כלומר כל עוד התגית הזו לא תופיע, הדפים ירונדרו עפ"י Transitional.
נוסיף את התגית הזו בקובץ ה - WebConfig שלנו תחת System.Web:
<system.web>
<xhtmlConformance mode="Strict" />
</system.web>
ועכשיו הדפים שלנו תקינים, כן!!!!!!!!11
עכשיו אחרי שהדפים שלנו תקינים, נעלה אותם לאינטרנט
ונבדוק שהאתר שלנו עומד בתקנים.
הממ... אבל מה? הוואלידטור טוען שהתגית form מקבלת את המאפיין name,
נבדוק את הקוד מקור, ונראה שהמאפיין name לא מופיע.
WTF?
מכיוון שהפקדים של .NET יוצרים קודים לא פשוטים, שלעיתים כוללים JS, הפלטפורמה דואגת להוציא קוד שיתאים לדפדפן.
כשהוואלידטור שולח בקשה לדף, הוא לא שולח את סוג הדפדפן(שאינו מזוהה ע"י הפלטפורמה), ולכן פלטפורמת ה - .NET לא מזהה את הדפדפן ושולחת HTML מה שנקרא Low Level,
כלומר HTML בסיסי ביותר ע"מ שכל דפדפן (גם הישנים בינהם) יוכלו לרנדר בקלות.
בשביל לשלוט בקוד שנוצר עבור כל דפדפן, יש עוד קובץ מוזר שנקרא Browser.browsers, אותו ניתן להוסיף ע"י לחיצה ימנית על ה - Solution שלנו או ה - Website ב - VS או ב - WebDev, ונבחר ב - Browser File.
אז לפרט על ה - browser file אני ממש לא הולך, אם אתם רוצים יותר פירוט עליו, אתם מוזמנים לקרוא כאן,
בקצרה אומר שבעזרת הקובץ הזה אפשר לשלוט על הפלט של דפי ה - aspx בהתאם לדפדפן של הלקוח.
עכשיו נערוך את הדף הזה ונשים בו את הקוד הבא:
<browsers>
<browser id=W3C_Validator parentID="default" >
<identification>
<userAgent match="^W3C_Validator" />
</identification>
<capabilities>
<capability value="W3C Validator" name="browser" />
<capability value="1.2" name="ecmaScriptVersion" />
<capability value="true" name="javascript" />
<capability value="true" name="supportsCss" />
<capability value="true" name="tables" />
<capability name="tagWriter"
value="System.Web.UI.HtmlTextWriter" />
<capability value="1.0" name="w3cdomversion" />
</capabilities>
</browser>
</browsers>
בקצרה הקוד הזה מגדיר את הדפדפן "W3C_Validator", שזהו בעצם ה"קליינט" של הואלידטור של W3 (כשהוא פונה לאתר שלכם), ומגדיר את התמיכה שלו בשפות סקריפט שונות וכיו"ב.
עוד פעם: מה שקורה זה שכשה - Validator פונה לאתר, הוא אינו מזהה את הדפדפן, ואת האפשרויות שלו, ולכן הדפים שמרונדרים יוצאים במה שנקרא "רמה נמוכה", מה שאומר קוד שיוכל להקרא ע"י כל דפדפן שנוצר ever!. כמובן שהקוד הזה הוא לא תקין, בכדי לתמוך בדפדפנים ישנים, שקיימים לפני שבכלל הומצא התקן הזה שקוראים לו xhtml.
וסוף סוף, הגעתם לסוף!
כן, עכשיו אחרי שנים של עבודה (או יותר נכון שנים של קריאה ושנייה עבודה, אתה פשוט מזבל את השכל!!!1), האתר שלנו תומך בתקן הנחמד שנקרא XHTML 1.1!
מקווה שמאמר זה עזר לכם, ולימד אתכם (לא רק לעשות העתק הדבק!, אלא גם על התקן, ועל קובץ שיכול להיות שימושי מאוד: browser file).
תכנות מהנה ותקין!