Ich habe versucht, einen deklarativen Razor-Helfer in meinem App_Code-Ordner für ein MVC 3 RTM-Projekt zu erstellen.
Das Problem, auf das ich gestoßen bin, war, dass die MVC HtmlHelper-Erweiterungen wie ActionLink nicht verfügbar sind. Dies liegt daran, dass die kompilierten Helfer von System.Web.WebPages.HelperPage
einer Html
Eigenschaft abgeleitet sind und diese verfügbar machen, obwohl sie System.Web.WebPages.HtmlHelper
eher vom Typ als vom Typ ist System.Web.Mvc.HtmlHelper
.
Ein Beispiel für die Art von Fehler, die ich bekam, ist:
'System.Web.Mvc.HtmlHelper' enthält keine Definition für 'ActionLink' und es konnte keine Erweiterungsmethode 'ActionLink' gefunden werden, die ein erstes Argument vom Typ 'System.Web.Mvc.HtmlHelper' akzeptiert (fehlt Ihnen eine using-Direktive) oder eine Montagereferenz?)
Meine einzige Lösung bestand darin, meine eigene HelperPage zu erstellen und die HTML-Eigenschaft zu überschreiben:
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; }
}
}
Ich muss dann oben auf jeden Helfer folgendes schreiben:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
Soll es in MVC 3 so schwer sein, oder mache ich etwas falsch?
quelle
Antworten:
Schauen Sie sich
Marcind
die Antwort auf diese Frage an. Was Sie erleben, ist eine Einschränkung beim Einfügen deklarativer Ansichten in denApp_Code
Ordner.quelle
Ich habe eine Erweiterungsmethode für den WebPages-Helfer erstellt, damit ich auf den Seiten-Helfer zugreifen kann.
quelle
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
und@using System.Web.Mvc.Html
in cshtml Helfer Datei in App_CodeHtmlHelper
Klasse also nur für Codierungszwecke benötigen , habe ich einen noch schnelleren Weg gefunden, dies über die statische Klasse zu tun,Microsoft.Security.Application.Encoder
wie in:Encoder.HtmlAttributeEncode(value)
Omar hat hier die richtige Antwort, aber ich wollte etwas hinzufügen (zögern Sie nicht, Omars Antwort als Antwort zu markieren).
Wir waren uns dessen in Version 1 bewusst und konnten keine großartige Lösung für das Produkt finden, aber David Ebbo (ein Architekt im ASP.Net-Team) hat ein Beispiel eines Visual Studio-Codegenerators veröffentlicht, bei dem es sich im Grunde um eine erste Untersuchung handelt Die Art von Ideen, die wir suchen, damit dies richtig funktioniert: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx
Probieren Sie das aus und sehen Sie, was Sie denken! Lassen Sie David wissen, wenn Sie Kommentare haben, indem Sie in seinem Blog posten.
quelle
Ähnlich wie bei @Jakes Antwort:
Verwendung:
Quelle: Dino Esposito - Programmieren von Microsoft ASP.NET MVC
quelle
Eine alternative Lösung:
Fügen Sie dies oben in Ihre Rasiermesser-Hilfedatei ein:
dann nenne es so:
quelle
Mein Ansatz besteht darin, die Seite einfach als Parameter an die Hilfsmethode zu übergeben. In Ihrem Beispiel wäre es also:
Dann nennen Sie es in Ihrer Razor-Ansicht, wo Sie es brauchen, so:
Wenn Sie dies sofort tun, erhalten Sie Zugriff auf Seiteneigenschaften wie
Html
oderUrl
die Sie normalerweise haben (und dadurch auf dieHtmlHelper
Erweiterungen).Als zusätzlichen Vorteil (falls erforderlich) erhalten Sie auch Zugriff auf Instanzeigenschaften wie die der Seite
ViewData
.quelle
Für Suchende wurde beim Erstellen von MVC-Ansichten als Teil einer Klassenbibliothek (zur Wiederverwendung von Komponenten) derselbe Fehler angezeigt. Die Lösung, auf die oben teilweise hingewiesen wurde, bestand darin, die folgenden using-Anweisungen oben in der CSHTM-Datei hinzuzufügen:
Keine weiteren Arbeiten notwendig.
quelle
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
beim Schweben@using System.Web.Mvc
. Irgendwelche Ideen?Ich weiß, dass es bei MVC 3 einige Intellisense-Probleme gibt. Ich denke, die Helfer funktionieren weiterhin, wenn Sie den Namespace in web.config festgelegt haben.
MVC 3 RTM wurde gerade veröffentlicht. Verwenden Sie diese oder eine Beta?
quelle
Es sieht so aus, als hätte ASP.NET MVC dieses Problem in VS 2013 behoben. Siehe diesen Beitrag http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- htmlhelper-ht
quelle
@using System.Web.Mvc.Html
oben in der cshtml-Datei in App_Code, aber das Schreiben von @Html .... zeigt keine der Erweiterungsmethoden wie zEditorFor
. Es ist lächerlich, dass dies nach 2 Hauptversionen und Blog-Posts, die behaupten, dass es implementiert wurde, nicht funktioniert. Es ist nicht. Tatsächlich können die Erweiterungsmethoden nicht funktionieren, da sie auf die System.Web.Mvc.HtmlHelper-Klasse abzielen, nicht auf die System.Web.WebPages.HtmlHelper-Klasse, die von der System.Web.WebPages.HelperPage-Klasse verfügbar gemacht wird.