2009-04-20 8 views
2

J'ai créé une méthode d'extension simple pour ASP.NET MVC UrlHelper. Il ne prend aucun argument car son travail consiste à rechercher le nom d'un fichier de feuille de style à partir de la configuration et à renvoyer une URL à la feuille de style. La méthode d'extension ressemble à peu près comme ceci:UrlHelper méthode d'extension appel codé non exécuté

public static string SiteStylesheet(this UrlHelper urlHelper) 
{ 
    var scriptFilename = UserInterfaceConfiguration.GetSection() 
          .Mvc.SiteStylesheet; 
    return urlHelper.Content(string.Format("~/Assets/Scripts/{0}", 
              scriptFilename)); 
} 

et je l'utilise comme ceci:

<link href="<%= Url.SiteStylesheet() %>" rel="Stylesheet" type="text/css" /> 

La méthode ne soit pas exécutée, cependant, et ce qui suit est rendu:

href="../Views/Shared/%3C%25=%20Url.SiteStylesheet()%20%25%3E" 

Comme vous pouvez le voir, la méthode d'extension n'est pas exécutée, mais le tout est simplement codé. Si je change la signature de la méthode d'accepter un paramètre:

public static string SiteStylesheet(this UrlHelper urlHelper, string dummy) 

alors la méthode d'extension est exécutée et la sortie est comme prévu:

href="/Assets/Stylesheets/FluidCMS.css" 

Donc, ma question est alors ce par la conception ou est-ce un bug dans le moteur de vue ASP.NET MVC Web Form?

Répondre

3

Ce problème a été soulevé à plusieurs reprises. La racine du problème est que la balise head> < a runat = "server", ce qui oblige l'analyseur à traiter les balises comme des balises de serveur. La solution de contournement la plus simple consiste simplement à supprimer runat = "server" de la balise head. Ce que vous perdez est la logique qui rend l'URL du lien par rapport à la page en cours, mais puisque vous utilisez votre assistant de toute façon, vous n'avez pas besoin de cela.

3

Lorsque j'ai rencontré ce problème, c'était parce que mes méthodes d'extension se trouvaient dans un espace de noms qui n'était pas spécifié dans le fichier web.config.

<add namespace="Your.Extension.Method.Namespace"/> 

Il passe sous configuration \ system.web \ pages \ namespaces

+1

Merci, mais l'espace de noms qui contient ma méthode d'extension est dans le web.config et je vois toujours le même comportement. – user93255

+1

Merci, est tombé dans celui-ci moi-même. Aussi n'avait pas remarqué qu'il y a 2 web.configs –

0

Je pense que vous avez trouvé un bug!

Je l'ai essayé et trouvé que cela se produit uniquement dans la section tête d'une page maître et uniquement dans les balises <link> (les balises <script> s'affichent très bien).

Le problème est évidemment que le texte de l'attribut de href n'est pas correctement interprété comme un nugget de code.

Cela va au-delà de ASP.NET MVC. Je l'ai essayé dans une page principale dans un site ASP.NET Web Form classique et le problème persiste. Cela semble être un bug dans le moteur de rendu Web Form ou quelque chose comme ça.

+0

Merci pour la confirmation et les détails supplémentaires. À ce stade, la solution de contournement, bien que hacky, est assez simple et non intrusive. Merci encore. – user93255

Questions connexes