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é était que les extensions MVC HtmlHelper, comme ActionLink, ne sont pas disponibles. C'est parce que les helpers compilés dérivent de System.Web.WebPages.HelperPage
, et bien qu'il expose une Html
propriété, son de type System.Web.WebPages.HtmlHelper
plutôt que System.Web.Mvc.HtmlHelper
.
Un exemple du type d'erreur que j'obtenais est:
'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 (il vous manque une directive using 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 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 aussi difficile dans MVC 3, ou est-ce que je fais quelque chose de mal?
la source
Réponses:
Jetez un œil à
Marcind
la réponse à cette question. Ce que vous rencontrez est une limitation de la mise des vues déclaratives dans leApp_Code
dossier.la source
J'ai créé une méthode d'extension pour l'assistant WebPages afin que je puisse accéder à l'assistant de page.
la source
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
et@using System.Web.Mvc.Html
dans le fichier helpers cshtml dans App_CodeHtmlHelper
classe qu'à des fins d'encodage, j'ai trouvé un moyen encore plus rapide de le faire via la classe statiqueMicrosoft.Security.Application.Encoder
comme dans:Encoder.HtmlAttributeEncode(value)
Omar a la bonne réponse ici, mais je voulais ajouter quelque chose (n'hésitez pas à marquer la réponse d'Omar comme la réponse).
Nous étions conscients de cela dans la v1 et n'avons pas été en mesure d'obtenir une excellente solution dans le produit, mais David Ebbo (un architecte de l'équipe ASP.Net) a publié un exemple de Visual Studio Code Generator qui est essentiellement une première exploration de le type d'idées que nous recherchons 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! Faites savoir à David si vous avez des commentaires en publiant sur son blog.
la source
Similaire à la réponse @Jakes:
Usage:
Source: Dino Esposito - Programmation Microsoft ASP.NET MVC
la source
Une solution alternative:
Ajoutez ceci au-dessus de votre fichier razor-helper:
alors appelez-le comme ceci:
la source
Mon approche consiste simplement à transmettre la page en tant que paramètre à la méthode d'assistance. Donc, dans votre exemple, ce serait:
Ensuite, dans votre vue Razor où vous en avez besoin, appelez-le comme ceci:
Cela vous donne immédiatement accès aux propriétés de la page comme
Html
ouUrl
que vous avez habituellement (et à travers cela lesHtmlHelper
extensions).Comme avantage supplémentaire (si vous en avez besoin), vous avez également accès aux propriétés d'instance telles que la page
ViewData
.la source
Pour le bénéfice des chercheurs, j'ai eu la même erreur lors de la création de vues MVC dans le cadre d'une bibliothèque de classes (pour la réutilisation des composants). La solution, partiellement évoquée ci-dessus, consistait à ajouter les instructions using suivantes en haut du fichier .cshtml:
Aucun autre travail nécessaire.
la source
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
en planant@using System.Web.Mvc
. Des idées?Je sais qu'il y a des problèmes d'intellisense avec MVC 3. Je pense que les helpers fonctionneront toujours si vous avez défini l'espace de noms dans web.config.
MVC 3 RTM vient de sortir, utilisez-vous ceci ou une version bêta?
la source
On dirait que ASP.NET MVC a résolu ce problème dans VS 2013. Voir cet article http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- htmlhelper-ht
la source
@using System.Web.Mvc.Html
en haut du fichier cshtml dans App_Code, mais écrire @Html .... ne révèle aucune des méthodes d'extension telles queEditorFor
. Il est ridicule que cela ne fonctionne pas après 2 versions majeures et des articles de blog affirmant qu'il a été implémenté. Ce n'est pas. En fait, les méthodes d'extension ne peuvent pas fonctionner, car elles ciblent la classe System.Web.Mvc.HtmlHelper, et non la classe System.Web.WebPages.HtmlHelper, qui est exposée par la classe System.Web.WebPages.HelperPage.