2008-10-20 6 views
11

Je construis un site Web ASP.Net MVC. Plutôt que de tout avoir dans un projet, j'ai décidé de séparer le Web, le Modèle et le Contrôleur en différents projets dans la même solution, qui se réfèrent les uns aux autres.Pourquoi mes extensions HtmlHelper ne fonctionnent-elles pas?

Le référencement va comme ceci:

Web --- [références] ---> Contrôleur --- [références] ---> Modèle

Maintenant, je voulais ajouter 2 méthodes personnalisées à la classe HtmlHelper - elles sont appelées "IncludeScript" et "IncludeStyle". Ils prennent chacun un paramètre de chaîne unique et génèrent respectivement un script ou une balise de liaison.

J'ai créé une classe d'extension, selon la documentation sur le Web, et écrit les deux méthodes et compilé l'application.

Maintenant, quand je vais dans la page Public.Master (qui est mon principal maître page, et l'un des endroits où je l'intention d'utiliser ces méthodes), je peux entrer un code tel que ci-dessous:

<%= Html.IncludeScript("\js\jquery.js") %>

L'IntelliSense reprend et la méthode IncludeScript et me montre la syntaxe très bien. Donc, je m'attendrais à ce que tout fonctionne.

Mais ce n'est pas le cas.

Tout compile, mais dès que je lance l'application, je reçois l'erreur d'exécution suivante de la ligne 14 de Default.aspx.cs:

c:\\Projects\\PhoneReel\\PhoneReel.Web\\Views\\Shared\\Public.Master(11): error CS0117: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'IncludeScript'

Voici la ligne de code que la erreur se produit sur:

httpHandler.ProcessRequest(HttpContext.Current);

Toutes les idées que pourrait aller mal ici?

+0

Pourriez-vous coller le code de script Include et le projet dans lequel il est présent? – Ramesh

Répondre

16

Assurez-vous que l'espace de noms de vos extensions est accessible à notre vue. Vous devez soit dans votre vue:

<%@ Import Namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"%> 

ou dans votre configuration web section namespaces:

<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/> 
+1

J'ai essayé les deux - toujours rien. BTW, juste au cas où, j'ai essayé de le faire dans une toute nouvelle solution avec de nouveaux projets et en ajoutant simplement mes fichiers, et il * STILL * me donne exactement la même erreur. – Jonathan

+1

Ca marche pour moi! Merci pour votre réponse! –

0

Etes-vous sûr que le compilateur est défini sur .NET Framework 3.5? Cela m'est arrivé lorsque j'ai défini par inadvertance le compilateur sur .NET Framework 2.0

+0

J'ai vérifié les propriétés du projet pour les 3 projets et ils sont tous définis sur .NET Framework 3.5. – Jonathan

1

Assurez-vous d'avoir une directive d'importation pour votre espace de noms de méthodes extensions dans votre page.

Sinon, Visual Studio peut être en mesure de voir mais votre site Web ne pourra pas.

+0

J'ai mis la ligne suivante dans Public.Master.cs: en utilisant PhoneReel.Web.Resources; J'ai aussi mis la ligne suivante dans Public.Master <% @ Import Namespace = "PhoneReel.Web.Resources" %> obtenir encore exactement la même erreur. – Jonathan

0

Dans la méthode IncludeScript assurez-vous que ce que vous étendez est System.Web.Mvc.HtmlHelper . Il est possible qu'il existe un HtmlHelper dans un autre espace de noms.

5

Si vous utilisez vues fortement typées et que votre méthode d'extension s'étend HtmlHelper<object>, l'extension ne sera pas trouvée.Vous devez créer un extendeur générique pour étendre HtmlHelper<T>.

public static string IncludeScript<T>(this HtmlHelper<T> html, string url) { 
    return "<script type=\"text/javascript\" src=\"" + url + "\"></script>"; 
} 

Ensuite, vous verrez votre méthode d'extension apparaître.

J'espère que cela aide.

+1

La bonne solution ici est de ne pas inclure le générique du tout - utiliser 'ce HtmlHelper html' plutôt que d'avoir un générique ou . Sauf si vous avez vraiment besoin du type de modèle. –

Questions connexes