121 votes

Utilisation des extensions MVC HtmlHelper à partir de vues déclaratives Razor

J'essayais de créer une aide déclarative 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. Ceci est dû au fait que les aides compilées dérivent de System.Web.WebPages.HelperPage et bien qu'il expose une Html sa propriété de type System.Web.WebPages.HtmlHelper plutôt que System.Web.Mvc.HtmlHelper .

Voici un exemple du type d'erreur que je recevais :

System.Web.Mvc.HtmlHelper" ne contient pas 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é (il vous manque une directive ou une référence d'assemblage)

Ma seule solution a été de créer ma 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 au début 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 que c'est censé être aussi difficile dans MVC 3, ou est-ce que je fais quelque chose de mal ?

42voto

Omar Points 16654

Jetez un coup d'œil à Marcind Réponse de la Commission à cette question. Ce que vous rencontrez est une limitation de la mise en place de vues déclaratives dans le système de gestion de l'information. App_Code dossier.

Placer vos aides dans l'App_Code fonctionne mais a certaines limitations qui impactent certains scénarios MVC (par exemple : pas d'accès aux aides MVC standard Html.)

38voto

Jake Hoffner Points 668

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

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

11voto

Andrew Nurse Points 4553

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

Nous étions conscients de ce problème dans la v1 et nous n'avons pas été en mesure d'obtenir une correction importante dans le produit, mais David Ebbo (un architecte de l'équipe ASP.Net) a posté un échantillon d'un générateur de code Visual Studio qui est essentiellement une première exploration du type d'idées que nous envisageons pour que cela fonctionne correctement : http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries.aspx

Essayez-le et voyez ce que vous en pensez ! Faites savoir à David si vous avez des commentaires en les publiant sur son blog.

9voto

Greg Gum Points 1441

Similaire à la réponse de @Jakes :

public static class MvcIntrinsics {
    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; }
    }

}

Uso:

@MvcIntrinsics.Html.Raw("test")

Source : Dino Esposito - Programmation de Microsoft ASP.NET MVC

3voto

HockeyJ Points 1408

Pour le bénéfice des chercheurs, j'ai eu la même erreur en créant des vues MVC dans le cadre d'une bibliothèque de classes (pour la réutilisation des composants). La solution (partiellement évoquée ci-dessus) a été d'ajouter les déclarations suivantes en haut du fichier .cshtml :

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

Aucun autre travail n'est nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X