Utilisation des extensions MVC HtmlHelper des vues déclaratives Razor

J’essayais de créer un assistant déclaratif Razor dans mon dossier App_Code pour un projet MVC 3 RTM.

Le problème que j’ai rencontré est que les extensions MVC HtmlHelper, comme ActionLink, ne sont pas disponibles. En effet, les helpers compilés dérivent de System.Web.WebPages.HelperPage et, bien qu’ils exposent une propriété Html , son type System.Web.WebPages.HtmlHelper plutôt que System.Web.Mvc.HtmlHelper .

Voici un exemple du type d’erreur que j’ai eu:

‘System.Web.Mvc.HtmlHelper’ ne contient pas de définition pour ‘ActionLink’ et aucune méthode d’extension ‘ActionLink’ acceptant un premier argument de type ‘System.Web.Mvc.HtmlHelper’ n’a pu être trouvée (vous manque une directive using ou une référence d’assemblage?)

Ma seule solution a été de créer mon propre HelperPage et de remplacer la propriété Html:

 using System.Web.WebPages; public class HelperPage : System.Web.WebPages.HelperPage { // Workaround - exposes the MVC HtmlHelper instead of the normal helper public static new HtmlHelper Html { get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; } } } 

Je dois ensuite écrire ce qui suit en haut de chaque aide:

 @inherits FunnelWeb.Web.App_Code.HelperPage @using System.Web.Mvc @using System.Web.Mvc.Html @helper DoSomething() { @Html.ActionLink("Index", "Home") } 

Est-ce censé être si dur dans MVC 3, ou est-ce que je fais quelque chose de mal?

Jetez un coup d’oeil à la réponse de Marcind à cette question. Vous êtes confronté à une limitation de la mise en place de vues déclaratives dans le dossier App_Code .

Mettre vos helpers dans App_Code fonctionne mais présente certaines limitations qui ont un impact sur certains scénarios MVC (par exemple: pas d’access aux html MVC standard).

J’ai créé une méthode d’extension pour l’assistant WebPages afin de pouvoir accéder à l’aide de page.

 public static HtmlHelper GetPageHelper(this System.Web.WebPages.Html.HtmlHelper html) { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; } 

Omar a la bonne réponse ici, mais je voulais append quelque chose (n’hésitez pas à marquer la réponse d’Omar comme réponse).

Nous étions au courant de cela dans v1 et nous n’avons pas réussi à trouver une solution idéale pour le produit, mais David Ebbo (un architecte de l’équipe ASP.Net) a publié un exemple de Visual Studio Code Generator qui constitue une première exploration de le genre d’idées que nous examinons pour que cela fonctionne correctement: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx

Essayez cela et voyez ce que vous en pensez! Dites à David si vous avez des commentaires en postant sur son blog.

Semblable à @Jakes répondre:

 public static class MvcInsortingnsics { public static System.Web.Mvc.HtmlHelper Html { get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html; } } public static System.Web.Mvc.AjaxHelper Ajax { get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Ajax; } } public static System.Web.Mvc.UrlHelper Url { get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Url; } } } 

Usage:

 @MvcInsortingnsics.Html.Raw("test") 

Source: Dino Esposito – Programmation Microsoft ASP.NET MVC

Une solution alternative:

Ajoutez ceci en haut de votre fichier d’aide:

 @functions { public static System.Web.Mvc.HtmlHelper HHtml = ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html; } 

puis appelez comme ceci:

 @HHtml.ActionLink("actionname") 

Pour le bénéfice des chercheurs, j’ai eu la même erreur lors de la création de vues MVC dans une bibliothèque de classes (pour la réutilisation des composants). La solution, mentionnée en partie ci-dessus, consistait à append les instructions suivantes en haut du fichier .cshtml:

 @using System.Web.Mvc @using System.Web.Mvc.Html 

Aucun autre travail nécessaire.

Mon approche consiste simplement à transmettre la page en tant que paramètre à la méthode d’assistance. Donc, dans votre exemple, ce serait:

 @helper DoSomething(WebViewPage page) { @page.Html.ActionLink("Index", "Home") } 

Ensuite, dans votre vue Razor où vous en avez besoin, appelez-la comme suit:

 @YourHelperFilename.DoSomething(this) 

Cela vous donne immédiatement access à des propriétés de page telles que Html ou Url que vous avez habituellement (et à travers les extensions HtmlHelper ).

Comme avantage supplémentaire (si vous en avez besoin), vous avez également access à des propriétés d’instance telles que ViewData la page.

Je sais qu’il y a des problèmes d’intellisense avec MVC 3. Je pense que les helpers fonctionneront toujours si vous avez l’espace de noms défini dans web.config.

MVC 3 RTM vient d’être réalisé, utilisez-vous ceci ou une version bêta?

On dirait que ASP.NET MVC a résolu ce problème dans VS 2013. Voir ce post http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- htmlhelper-ht