3

En ce moment, je suis en train de travailler autour d'un IE6/7 bug qui nécessite l'emballage de la </a> balise de fermeture avec ce commentaire spécifique IE pour faire un travail de menu déroulant:Possibilité d'écrire une méthode d'extension pour la méthode Html.ActionLink() d'ASP.NET?

<!--[if IE 7]><!--></a><!--<![endif]--> 

Malheureusement, je ne peut pas injecter ce directement dans mon code Voir la page comme ceci:

<%= Html.ActionLink("LinkName<!--[if IE 7]><!--></a><!--<![endif]-->","Action","Controller") %> 

comme Html.ActionLink fera la chose sûre et filtrer le commentaire pour éviter une attaque par injection Javascript. OK cool. Cela me convient. Bonne décision de conception. Ce que je voudrais faire est d'écrire une méthode d'extension à cela, mais le processus m'échappe comme je ne l'ai pas fait auparavant.

Je pensais que cela fonctionnerait, mais Intellisense ne semble pas prendre cette méthode d'extension que j'ai écrite.

public static class MyLinkExtensions 
{ 
    public static string ActionLinkIE(this HtmlHelper htmlHelper, 
     string linkText, string actionName, string controllerName) 
    { 
     return LinkExtensions.ActionLink(htmlHelper, linkText, actionName, controllerName). 
      Replace(@"</a>", @"<!--[if IE 7]><!--></a><!--<![endif]-->"); 
    } 
} 

Des suggestions?

EDIT: Le nom de la classe est-il important? (dans mon cas, je l'ai appelé MyLinkExtensions)

De même, lorsque vous passez la souris sur <%= Html.ActionLink() %>, cela semble être déjà une méthode d'extension. Puis-je étendre une méthode d'extension?

+0

Avez-vous essayé de construire l'application? J'ai eu des cas où le code est considéré comme illégal (ou n'apparaît pas dans Intellisense), bien que je sache que c'est OK – ChrisF

+0

Oui, j'ai essayé de le construire, pas de chance – Pretzel

Répondre

6

Vous avez probablement besoin de mettre votre espace de noms Extensions web.config:

<pages>  
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Linq" /> 
     <add namespace="Pretzel.Extensions.Html" /> 
     </namespaces> 
</pages> 

Cela devrait aider le IntelliSense.

+0

C'était tout à fait ça, je n'aurais jamais compris ça sans votre aide. – Pretzel

+0

En outre, vous pouvez placer vos classes d'extension dans le même espace de noms que les classes que vous étendez. Par exemple, j'ai ajouté des extensions à 'HtmlHelper' dans' System.Web.Mvc'. De cette façon, tant que vous référencez la bibliothèque, les méthodes d'extension seront automatiquement récupérées. (Cela a également un sens logique si l'on considère le type étendu.) – Peter

0

Vous pouvez modifier la bibliothèque pour l'encodage de sortie en fonction de ce poste de phil haack http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx

Cela vous donne la possibilité d'utiliser AntiXSS http://wpl.codeplex.com/. Il est une bibliothèque de Microsoft qui a:

  • JavascriptEncoding
  • encodage par whitelist

Presque toute application qui utilise ajax et javascript aura besoin JavascriptEncoding de toute façon, donc je pense qu'il n'y a aucune chance d'aller sans cette bibliothèque.

Si l'assistant utilise cette bibliothèque, il vous suffit d'ajouter votre balise à la liste blanche et vous êtes prêt à partir.

EDIT

Je viens de voir sur la page que cela ne marche pas travailler le Helper existant Html :-(. Eh bien, je garder ce poste jusqu'à MVC3. Si tout va bien AntiXSS est inclus alors hors de la boîte.