web-dev-qa-db-fra.com

Razor: Assistants HTML déclaratifs

J'essaie d'écrire un simple assistant HTML déclaratif:

@helper Echo(string input) {
    @input
}

L'assistant fonctionne bien si je l'intègre dans la page sur laquelle je souhaite l'utiliser. Mais si je le déplace vers un fichier .cshtml Séparé et que je place ce fichier dans le répertoire ~/Views/Helpers, Ma vue ne peut plus être compilée car l'aide n'est pas trouvée. Selon Scott Gu's article de blog sur Razor cela devrait fonctionner.

Qu'est-ce que je fais mal?

48
Adrian Grigore

Le ~/Views/Helpers emplacement tel que décrit dans ce message ScottGu ne fonctionnera pas dans MVC 3 RTM. Au moment où cet article a été écrit, c'était une idée de conception que nous balançions, mais finalement nous n'avons pas pu la mettre en œuvre.

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

49
marcind

Solution simple:

Dans chaque assistant, ajoutez la page WebViewPage d'argument.

App_Code\Test.cshtml:

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

@helper HelloWorld(WebViewPage page)
{
    @page.Html.Label("HelloWorld")
}

Cette utilisation d'aide dans n'importe quelle page:

 @Test.HelloWorld(this)
36
Serj-Tm

Comme l'a dit marcind , nous n'avons pas pu supporter le ~/Views/Helpers emplacement en raison de certaines limitations de notre modèle de compilation.

Nous travaillons sur une meilleure solution pour les assistants HTML déclaratifs, mais cela ne fera pas la v1. Pour la v1, nous avons deux solutions:

  1. App_Code (qui a quelques problèmes comme Marcin l'a mentionné, mais fonctionne)
  2. David Ebbo (membre de l'équipe) a n complément Visual Studio qui les compile dans votre DLL
9

Dans App_Code, un @helper en a besoin pour fonctionner correctement:

// These are important for `Html.RouteLink` and such.
@using System.Web.Mvc;
@using System.Web.Mvc.Routing;
@using System.Web.Mvc.Html;
@using System.Web.Mvc.Razor;

@helper SomeHelper()
{
    // Get page and pull helper references from it.
    var wvp = PageContext.Page as System.Web.Mvc.WebViewPage;
    var Url = wvp.Url; // UrlHelper access
    var Html = wvp.Html; // HtmlHelper access
    var ViewBag = wvp.ViewBag;
    // Helper code comes here...
}
7
CodeAngry

J'ai également suivi les étapes répertoriées dans le blog de Scott et je n'ai pas pu le faire fonctionner non plus.

J'ai fait quelques recherches et trouvé ce lien: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create -custom-helper-method

J'ai suivi les étapes et ça marche. La clé semble être à la fois le dossier App_Code ainsi que l'utilisation du nom de fichier dot helper name lors de l'appel de l'aide.

6
Brian Ball

Je sais que c'est tard dans le jeu ... Mais, passez la vue actuelle à la fonction d'aide. Depuis la vue, vous avez accès au HTML et aux fonctions d'assistance.

4
Jim Shaw

Un autre point de vue réponse de CodeAngry , cela active les assistants pour chaque méthode du fichier.

@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Web.Mvc.Routing;
@using System.Web.Mvc.Razor;

@functions {
    private static WebViewPage page { get { return PageContext.Page as WebViewPage; } }
    private static System.Web.Mvc.HtmlHelper Html { get { return page.Html; } }
    private static UrlHelper Url { get { return page.Url; } }
    private static dynamic ViewBag { get { return page.ViewBag; } }
}
3
Ryan Buddicom