פיתוח למוזילה ב-ASP.NET
מתוך וויקי
מאמר זה מתייחס ל-ASP.NET 1.1. יתכן שהמצב השתפר בגרסה 2.0 ששוחררה לאחרונה.
שיפור ה־HTML
לעיתים קרובות אתרים שנכתבו בעזרת ASP.NET מוצגים בצורה משובשת בדפדפן מוזילה. הסיבה לכך היא ש־ASP.NET מנסה לזהות את הדפדפן שניגש לאתר, על פי מחרוזת זיהוי הדפדפן (User Agent), על מנת להגיש לו קוד HTML שיתאים ליכולות של אותו דפדפן. הזיהוי מתבצע על ידי זיהוי תבנית במחרוזת, בעזרת ביטוי רגולרי המוגדר בקובץ הקונפיגורציה של השרת. בברירת מחדל, הקובץ מכיל תבניות לזיהוי דפדפן אקספלורר, נטסקייפ 6, אופרה, WebTV, ואקספלורר למחשבי כף יד. דפדפנים שאינם מזוהים מבין אלה, מקבלים HTML נחות, שתואם בערך ל-HTML 3. כתוצאה מכך, משתמש שיגש אל אתר שנכתב בעזרת ASP.NET ולא בוצע בו שינוי כדי לזהות דפדפנים חדישים יותר, יסבול מתצוגה לקויה.
כדי לתקן זאת, יש להוסיף ביטויים רגולריים מתאימים. ניתן להוסיף את הביטויים לקובץ machine.config, הנמצא בדרך כלל בתיקייה C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG, ואז הוא ישפיע על כל האתרים המופעלים על השרת, או בקובץ web.config הנמצא בתיקייה של אתר מסויים, או אפילו בתת תיקייה של אתר, ואז הוא ישפיע על התיקייה שבה הוא נמצא והתיקיות שמתחתיה.
התוספת הבאה מוסיפה תמיכה לדפדפני מוזילה, קונקרר, גרסאות חדשות של אופרה, ודפדפנים מבוססי Apple Web Kit, כמו ספארי.
<!--
Name: BrowserCaps update for modern browsers, http://slingfive.com/pages/code/browserCaps/
Author: Rob Eberhardt, http://slingfive.com/
History:
2004-11-19 improved detection of Safari, Konqueror & Mozilla variants, added Opera detection
2003-12-21 updated TagWriter info
2003-12-03 first published
-->
<!-- GECKO Based Browsers (Netscape 6+, Mozilla/Firefox, ...) //-->
<case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))?">
browser=Gecko
<filter>
<case match="(Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))">
type=${type}
</case>
<case> <!-- plain Mozilla if no VendorProductToken found -->
type=Mozilla
</case>
</filter>
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
<case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
version=${version}
majorversion=0${major}
minorversion=0${minor}
<case match="^b" with="${letters}">
beta=true
</case>
</case>
</case>
<!-- AppleWebKit Based Browsers (Safari...) //-->
<case match="AppleWebKit/(?'version'(?'major'\d?)(?'minor'\d{2})(?'letters'\w*)?)">
browser=AppleWebKit
version=${version}
majorversion=0${major}
minorversion=0.${minor}
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
<case match="AppleWebKit/(?'version'(?'major'\d)(?'minor'\d+)(?'letters'\w*))(.* )?(?'type'[^/\d]*)/.*( |$)">
type=${type}
</case>
</case>
<!-- Konqueror //-->
<case match=".+[K|k]onqueror/(?'version'(?'major'\d+)(?'minor'(\.[\d])*)(?'letters'[^;]*));\s+(?'platform'[^;\)]*)(;|\))">
browser=Konqueror
version=${version}
majorversion=0${major}
minorversion=0${minor}
platform=${platform}
type=Konqueror
frames=true
tables=true
cookies=true
javascript=true
javaapplets=true
ecmascriptversion=1.5
w3cdomversion=1.0
css1=true
css2=true
xml=true
tagwriter=System.Web.UI.HtmlTextWriter
</case>
<!-- Opera //-->
<case match="Opera[ /](?'version'(?'major'\d+)(?'minor'\.(?'minorint'\d+))(?'letters'\w*))">
<filter match="[7-9]" with="${major}">
tagwriter=System.Web.UI.HtmlTextWriter
</filter>
<filter>
<case match="7" with="${major}">
<filter>
<case match="[5-9]" with="${minorint}">
ecmascriptversion=1.5
</case>
<case>
ecmascriptversion=1.4
</case>
</filter>
</case>
<case match="[8-9]" with="${major}">
ecmascriptversion=1.5
</case>
</filter>
</case>
</browserCaps>
יש לשים את הקטע הזה תחת התג <system.web>, שתחת התג הראשי של הקובץ, <configuration>. אם כבר יש בלוק <browserCaps> בקובץ (ובקובץ machine.config אכן יש כזה) יש להוסיף את הקטע בסוף הבלוק, בהשמטת תגיות browserCaps.
פקדי אימות קלט
ASP.NET מכיל מספר פקדים מוכנים לווידוא נכונות הקלט בטפסים. פקדים אלה יודעים להשוות בין שני שדות (למשל, כאשר מבקשים להכניס פרט פעמיים כדי להיות בטוחים שאין בו טעות), לוודא ששדה מתאים לביטוי רגולרי מסויים (למשל, מבנה של כתובת דוא"ל), ועוד. בברירת מחדל, פקדים אלה פועלים בצד הלקוח, בעזרת ג'אווה סקריפט. כלומר, אם יש ללקוח דפדפן אקספלורר. אם בחר להשתמש בדפדפן מבוסס מוזילה, הפקדים לא יפעלו, ובמקרה הטוב לא יאפשרו לשלוח את הטופס. במקרה הרע, יאפשרו לשלוח טופס עם נתונים שגויים.
ווידוא קלט בצד הלקוח הוא רעיון גרוע בכל מקרה, משום שקל לעקוף אותו. קל לשלוח את הטופס בצורה מלאכותית, תוך עקיפת כל מנגנון הטופס, בעזרת תוכנה חיצונית שתממש את פרוטוקול HTTP.
מסיבות אלה, יש להגדיר אותם כך שיפעלו בצד השרת, ויבצעו post בכל מקרה (ובמקרה של טעות, יחזרו עם הטופס והודעת שגיאה). כדי לעשות זאת, יש לתת לתכונה EnableClientScript את הערך false.

