2009-09-16 10 views
12

Al igual que cualquier otro desarrollador web, me siento frustrado de hackear mi código de sitio para trabajar con IE 6. Así que decidí dejar el soporte para IE 6 y pídales cortésmente que actualicen a IE 7+ o Firefox.cómo mostrar una página especial para usuarios de IE6 solicitándoles que actualicen en ASP.NET MVC

¿Puede sugerirme cómo detectar usuarios de IE6 y mostrar una página especial que muestra los detalles de la actualización en ASP.NET MVC?

¿Es una buena idea manejar esto en el scripting del lado del servidor? ¿o recomienda utilizar algún script del lado del cliente como jQuery para manejar esto?

Respuesta

20

Lo más fácil OMI es crear un atributo del filtro acción. Luego puede etiquetar sus controladores con él (o agregarlo a los filtros globales en MVC3).

Aquí es el atributo: cheques

/// <summary> 
/// If the user has IE6, this will present them with a page that tells them they have a crappy old browser. It gives them options to upgrade but they can also 
/// choose to proceed anyway. This check is done only when they first visit the site. A cookie also prevents unnecessary future checks, so this won't slow the app down. 
/// </summary> 
public class WarnAboutIE6Attribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 
     //this will be true when it's their first visit to the site (will happen again if they clear cookies) 
     if (request.UrlReferrer == null && request.Cookies["browserChecked"] == null) 
     { 
      //give old IE users a warning the first time 
      if (request.Browser.Browser.Trim().ToUpperInvariant().EqualsExact("IE") && request.Browser.MajorVersion <= 6) 
      { 
       filterContext.Controller.ViewData["RequestedUrl"] = request.Url.ToString(); 

       filterContext.Result = new ViewResult { ViewName = "InternetExplorerOldWarning" }; 
      } 

      filterContext.HttpContext.Response.AppendCookie(new HttpCookie("browserChecked", "true")); 
     } 

    } 
} 

este atributo para IE6, y si está presente, se representa la vista "InternetExplorerOldWarning", que hay que crear. Solo presenta esta advertencia una vez mediante el uso de una cookie. Por supuesto, podrías modificar eso como quieras. En mi opinión, les di enlaces para actualizar o descargar otros navegadores. También les di la oportunidad de continuar con IE6. Échale un vistazo:

  <h3> 
     Your Internet Explorer is Outdated</h3> 
    <div class="warning">Your version of Internet Explorer is a bit too old and unfortunately won't work well with this site.</div> 
    <p>Have no fear. You have options and in just a few minutes you can be rocking out in our app:</p> 
    <ul> 
    <li>If you have FireFox, Safari, or Google Chrome already on your computer use one of them for Takeoff instead.</li> 
    <li>Upgrade to the <a href="http://www.microsoft.com/windows/internet-explorer/worldwide-sites.aspx">latest Internet Explorer.</a> You can download and install right away. Even Microsoft recommends you do this.</li> 
    <li>Download an Internet Explorer alternative. We recommend <a href="http://www.mozilla.com/en-US/firefox/firefox.html">FireFox</a>, <a href="http://www.apple.com/safari/download/">Safari</a>, or <a href="http://www.google.com/chrome">Google Chrome</a>. Choose one or all because each is great!</li> 
    </ul> 

    <p>This warning page will only show once. If you really want to use Takeoff with your current Internet Explorer, we won't stop you. But beware, it will probably look like garbage!</p> 
    <p>Whatever dude, I want to <a href="@ViewData["RequestedUrl"] ">my old, insecure, scary, dangerous version</a> of Internet Explorer.</p> 

</div> 
+1

Solución muy limpia. Muchas gracias. – Gopinath

+0

No necesitó el código completo, pero acceder a la información del navegador ('request.Browser.Browser' y' request.Browser.MajorVersion') era el punto. Buen trabajo. – nrod

1

Mostrar una página totalmente diferente para IE 6 es un poco duro en mi humilde opinión, a menos que desee bloquear/redirigir no es necesario validar esto en el lado del servidor.

"Cortésmente" significaría que valida el navegador en el lado del cliente y muestra un mensaje de alerta/recordatorio para actualizar. La gente al stoplivinginthepast.com have build a standard logic to do this se basa en conditional comments (le sugieren que muestre un mensaje en la parte superior de su página de destino).

http://www.stoplivinginthepast.com/get-the-code/ http://www.stoplivinginthepast.com/wp-content/uploads/2009/02/warninggrab.jpg

Imagen cortesía: http://www.stoplivinginthepast.com/

2

Sería terrible práctica para prestar servicios específicamente una página diferente no funcionales a IE6. Para empezar, si estás en el Reino Unido es probable que te topes con la DDA, por unos segundos (dependiendo de tu situación, por supuesto) realmente no quieres detener al 20-25% de tus usuarios que usan tu sitio. .

Muchas personas se ven obligadas a utilizar IE6 en el trabajo. Orinarlos innecesariamente no tiene sentido comercial.

Dicho esto, no hay razón para que su sitio luzca perfecto como un píxel. Puede detectar que están utilizando IE6 en el lado del servidor con Request.UserAgent y mostrar un mensaje discreto en la parte superior de su página de inicio (o en la parte superior de cada página) para que los usuarios sepan que su navegador es muy antiguo y no lo usan. lo soporto más. Entonces puede servir una hoja de estilo IE6 específica (muy reducida), o si los problemas de renderización de IE6 no son tan graves como para hacer que su sitio no se pueda utilizar, simplemente no puede preocuparse por ellos.

Cuando estoy haciendo trabajo en Internet estos días cobro extra para soportar IE6.

13

lo puede hacer la detección de la codificación:

// ASP.net MVC C# example 
if (Request.Browser.Browser == "IE" && Request.Browser.Version.ConvertTo<float>() < 7.0) 
{ 
    // output message to urge user to upgrade to latest IE browser 
} 
0

Encontré esta respuesta al tener problemas con IE8 y menos. Quería que los usuarios utilizaran IE9 o posterior pero con el modo de compatibilidad en IE9 apareciendo como IE7.

Complementando Steve Potters para responder e inspirarse en el siguiente enlace: http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae715fd2-1ddd-46f7-8c26-9aed6b2103f1/how-to-detect-compatibility-mode-in-ie-any-version?forum=netfxjscript.

he cambiado de código para

public class WarnAboutIeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 
     var isIe9Compatible = false; 

     if (request.UrlReferrer == null) 
     { 
      if (request.Browser.Browser.Trim().ToUpperInvariant().Equals("IE") && request.Browser.MajorVersion <= 8) 
      { 
       var useragent = request.Headers.GetValues("User-Agent"); 
       if (useragent != null) isIe9Compatible = useragent[0].Contains("Trident/5.0"); 
       if (!isIe9Compatible) filterContext.Result = new ViewResult {ViewName = "_InternetExplorerOldWarning"}; 
      } 
     } 
    } 
} 

Adición en la esperanza que ayuda a alguien.

Cuestiones relacionadas