En utilisant MVC HtmlHelper extensions de Rasoir déclarative vues
J'ai essayé de créer un Rasoir déclarative aide dans mon dossier App_Code pour un MVC 3 RTM projet.
Le problème que j'ai rencontré était que le MVC HtmlHelper extensions, comme ActionLink, ne sont pas disponibles. C'est parce que la compilation des aides de dériver de System.Web.WebPages.HelperPage
, et même s'il expose une Html
de la propriété, de son de type System.Web.WebPages.HtmlHelper
plutôt que System.Web.Mvc.HtmlHelper
.
Un exemple du genre d'erreur que je recevais est:
'Système.Web.Mvc.HtmlHelper " n'
contiennent une définition pour 'ActionLink'
et aucune méthode d'extension 'ActionLink'
acceptant un premier argument de type
'Système.Web.Mvc.HtmlHelper " pourrait être
trouvé (êtes-vous en manque un à l'aide
la directive ou une référence d'assembly?)
Ma seule solution a été de créer mon propre HelperPage et remplacer le code Html de la propriété:
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; }
}
}
J'ai ensuite écrire le code suivant en haut de chaque helper:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
Est-il destiné à être ce dur dans MVC 3, ou suis-je en train de faire quelque chose de mal?
- Si vous avez besoin également l'Url helper vous culd ajouter cette ligne de code pour HelperPage: public static UrlHelper Url { get { return new UrlHelper(Html.ViewContext.RequestContext); } }
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à
Marcind
's réponse à cette question. Ce que vous êtes en train de vivre est une limitation de la mise déclarative vues dans leApp_Code
dossier.J'ai créé une méthode d'extension pour les Pages web helper pour que je puisse avoir accès à la page d'aide.
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
et@using System.Web.Mvc.Html
en cshtml aides fichier à l'intérieur de App_CodeHtmlHelper
classe pour l'encodage des fins, j'ai trouvé un encore plus rapide façon de le faire est par l'intermédiaire de la classe statiqueMicrosoft.Security.Application.Encoder
comme dans:Encoder.HtmlAttributeEncode(value)
Omar a le droit de répondre ici, mais je voulais ajouter quelque chose (n'hésitez pas à marquer Omar que la réponse de la réponse).
Nous étions conscients de ce en v1 et n'étaient pas en mesure d'obtenir une grande correction dans le produit, mais David Ebbon (un architecte sur la ASP.Net l'équipe a affiché un exemple de Code de Visual Studio Générateur qui est fondamentalement une première exploration de la nature des idées, nous sommes à la recherche à faire ce travail correctement: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries.aspx
Essayer cela et voir ce que vous en pensez! Laissez David savoir si vous avez des commentaires en postant sur son blog.
Similaire à @Jakes réponse:
Utilisation:
Source: Dino Esposito - la Programmation de Microsoft ASP.NET MVC
Une solution alternative:
Ajouter ce sur le dessus de votre rasoir-helper fichier:
puis l'appeler comme ceci:
Pour le bénéfice des chercheurs, j'ai eu le même message d'erreur lors de la création de vues MVC dans le cadre d'une bibliothèque de classe (pour la réutilisation des composants). La solution, partiellement évoqué ci-dessus, a été d'ajouter les éléments suivants à l'aide des déclarations au sommet de l' .cshtml fichier:
Aucun travail supplémentaire n'est nécessaire.
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
lorsque le curseur de@using System.Web.Mvc
. Des idées?Mon approche est tout simplement de passer la page en tant que paramètre à la méthode d'assistance. Donc dans votre exemple, il serait:
Puis dans votre Rasoir point de vue où vous en avez besoin de l'appeler comme ceci:
Faire cela vous donne immédiatement accès à la page des propriétés comme
Html
ouUrl
que vous avez généralement (et à travers que leHtmlHelper
extensions).Comme un avantage supplémentaire (si vous en avez besoin), vous bénéficiez également de l'accès à l'instance de propriétés telles que la page du
ViewData
.Je sais qu'il y a quelques intellisense problèmes avec MVC 3. Je pense que les aides peuvent encore fonctionner si vous avez l'espace de noms défini dans le web.config.
MVC 3 RTM a été realeased êtes-vous d'utiliser ce produit ou à une version bêta?
Ressemble à la ASP.NET MVC a résolu ce problème en VS 2013. Voir ce post http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this-htmlhelper-ht
@using System.Web.Mvc.Html
en haut de la cshtml fichier dans App_Code, mais d'écrire @Html.... révèle rien de l'extension des méthodes telles queEditorFor
. C'est ridicule que ce n'est pas de travail après 2 versions majeures et des billets de blog prétendant qu'il a été mis en œuvre. Il n'est pas. En fait, l'extension des méthodes ne peut pas fonctionner, car ils ciblent le Système.Web.Mvc.HtmlHelper de la classe, pas le Système.Web.Les pages web.HtmlHelper classe, qui est exposée par le Système.Web.Les pages web.HelperPage classe.