פיתוח למוזילה ב-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 &amp; 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.

קישורים חיצוניים

קישור קצר לדף זה: Developing for Mozilla with ASP.NET
כלים אישיים