2008-10-20 15 views
11

Ich baue eine ASP.Net MVC-Website. Anstatt alles in einem Projekt zu haben, habe ich beschlossen, das Web, das Modell und den Controller in verschiedene Projekte in der gleichen Lösung aufzuteilen, die sich gegenseitig referenzieren.Warum funktionieren meine HtmlHelper-Erweiterungen nicht?

Die Referenzierung geht so:

Web --- [Referenzen] ---> Controller --- [Referenzen] ---> Modell

Jetzt wollte ich hinzufügen 2 benutzerdefinierte Methoden für die HtmlHelper-Klasse - sie heißen "IncludeScript" und "IncludeStyle". Sie nehmen jeweils einen einzelnen String-Parameter und erzeugen jeweils ein Skript oder Link-Tag.

Ich habe eine Extender-Klasse erstellt, gemäß der Dokumentation im Web, und schrieb die beiden Methoden und kompilierte die Anwendung.

Nun, wenn ich in die Public.Master Seite gehen (was mein Haupt Master-Seite ist, und einer der Orte, an denen ich diese Methoden verwenden will), I-Code wie unten eingeben:

<%= Html.IncludeScript("\js\jquery.js") %>

Die IntelliSense nimmt und IncludeScript-Methode und zeigt mir die Syntax gut. Ich würde also erwarten, dass alles funktioniert.

Aber es tut es nicht.

Alles kompiliert, aber sobald ich die Anwendung ausführen, bekomme ich die folgenden Laufzeitfehler aus der Leitung 14 von Default.aspx.cs:

c:\\Projects\\PhoneReel\\PhoneReel.Web\\Views\\Shared\\Public.Master(11): error CS0117: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'IncludeScript'

Hier ist die Codezeile, die das Fehler treten auf:

httpHandler.ProcessRequest(HttpContext.Current);

Irgendwelche Ideen, was könnte falsch hier gehen?

+0

Könnten Sie den Include-Skriptcode einfügen und auch das Projekt, in dem es vorhanden ist? – Ramesh

Antwort

16

Überprüfen Sie, ob der Namespace Ihrer Erweiterungen für unsere Ansicht zugänglich ist. Sie müssen entweder das Ihrer Ansicht nach:

<%@ Import Namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"%> 

oder diese in Ihrem Web-Config-Namespaces Abschnitt:

<add namespace="MyRootNamespace.NamespaceForMyHtmlHelperExtensions"/> 
+1

Ich habe beides versucht - immer noch nichts. BTW, nur für den Fall, ich habe versucht, dies in einer völlig neuen Lösung mit neuen Projekten und nur meine Dateien hinzufügen, und es ist * STILL * mir genau den gleichen Fehler. – Jonathan

+1

Es funktioniert für mich! Danke für deine Antwort! –

0

Sind Sie sicher, dass der Compiler auf .NET Framework 3.5 festgelegt ist? Das ist mir passiert, als ich versehentlich den Compiler auf .NET Framework 2.0 gesetzt habe.

+0

Ich habe die Projekteigenschaften für alle 3 Projekte überprüft und sie sind alle auf .NET Framework 3.5 eingestellt. – Jonathan

1

Stellen Sie sicher, dass Sie eine Import-Anweisung in den Namespace Ihrer Erweiterungsmethoden auf Ihrer Seite haben.

Andernfalls kann Visual Studio möglicherweise sehen, aber Ihre Website wird nicht in der Lage sein.

+0

Ich setze die folgende Zeile in Public.Master.cs: mit PhoneReel.Web.Resources; Ich habe auch die folgende Zeile in Public.Master <% @ Import Namespace = "PhoneReel.Web.Resources" %> noch genau die gleichen Fehler. – Jonathan

0

Im IncludeScript Methode stellen Sie sicher, dass das, was Sie erstreckt System.Web.Mvc.HtmlHelper . Es ist möglich, dass ein HtmlHelper in einem anderen Namespace vorhanden ist.

5

Wenn Sie stark typisierte Ansichten verwenden, und Ihre Erweiterungsmethode erweitert HtmlHelper<object>, wird es nicht die Erweiterung finden.Sie müssten einen generischen Extender erstellen, um HtmlHelper<T> zu erweitern.

public static string IncludeScript<T>(this HtmlHelper<T> html, string url) { 
    return "<script type=\"text/javascript\" src=\"" + url + "\"></script>"; 
} 

Dann wird Ihre Extender-Methode angezeigt.

Ich hoffe, dass hilft.

+1

Die korrekte Lösung hier ist, das generische überhaupt nicht einzuschließen - benutzen Sie 'diesen HtmlHelper html' anstatt irgendeinen generischen oder . Außer natürlich, Sie brauchen wirklich den Modelltyp. –

Verwandte Themen