Ich wollte auch js-Dateien, die sich auf eine Ansicht beziehen, im selben Ordner wie die Ansicht ablegen.
Ich konnte die anderen Lösungen in diesem Thread nicht zum Laufen bringen, nicht dass sie kaputt sind, aber ich bin zu neu in MVC, um sie zum Laufen zu bringen.
Unter Verwendung der hier gegebenen Informationen und mehrerer anderer Stapel habe ich eine Lösung gefunden, die:
- Ermöglicht das Ablegen der Javascript-Datei in demselben Verzeichnis wie die Ansicht, der sie zugeordnet ist.
- Skript-URLs geben die zugrunde liegende physische Site-Struktur nicht preis
- Skript-URLs müssen nicht mit einem abschließenden Schrägstrich (/) enden.
- Beeinträchtigt keine statischen Ressourcen, z. B.: /Scripts/someFile.js funktioniert weiterhin
- Es ist nicht erforderlich, dass runAllManagedModulesForAllRequests aktiviert ist.
Hinweis: Ich verwende auch HTTP-Attribut-Routing. Es ist möglich, dass die in meiner Lösung verwendete Route so geändert wird, dass sie funktioniert, ohne dies zu aktivieren.
Angesichts des folgenden Beispiels Verzeichnis / Dateistruktur:
Controllers
-- Example
-- ExampleController.vb
Views
-- Example
-- Test.vbhtml
-- Test.js
Unter Verwendung der unten angegebenen Konfigurationsschritte in Kombination mit der obigen Beispielstruktur würde auf die URL /Example/Testder Testansicht zugegriffen über: und auf die Javascript-Datei würde verwiesen über:/Example/Scripts/test.js
Schritt 1 - Attribut-Routing aktivieren:
Bearbeiten Sie Ihre Datei /App_start/RouteConfig.vb und fügen Sie sie routes.MapMvcAttributeRoutes()direkt über den vorhandenen Routen hinzu. MapRoute:
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.Mvc
Imports System.Web.Routing
Public Module RouteConfig
Public Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
' Enable HTTP atribute routing
routes.MapMvcAttributeRoutes()
routes.MapRoute(
name:="Default",
url:="{controller}/{action}/{id}",
defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}
)
End Sub
End Module
Schritt 2 - Konfigurieren Sie Ihre Site so, dass /{controller}/Scripts/*.js als MVC-Pfad und nicht als statische Ressource behandelt und verarbeitet wird
Bearbeiten Sie Ihre Datei /Web.config und fügen Sie dem Abschnitt system.webServer -> Handler der Datei Folgendes hinzu:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Hier ist es wieder mit Kontext:
<system.webServer>
<modules>
<remove name="TelemetryCorrelationHttpModule"/>
<add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="managedHandler"/>
<remove name="ApplicationInsightsWebTracking"/>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler"/>
</modules>
<validation validateIntegratedModeConfiguration="false"/>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Schritt 3 - Fügen Sie Ihrer Controller-Datei das folgende Ergebnis der Skriptaktion hinzu
- Stellen Sie sicher, dass Sie den Routenpfad so bearbeiten, dass er mit dem Namen {controller} für den Controller übereinstimmt. In diesem Beispiel lautet er: <Route (" Beispiel / Skripte / {Dateiname}")>
Sie müssen dies in jede Ihrer Controller-Dateien kopieren. Wenn Sie möchten, gibt es wahrscheinlich eine Möglichkeit, dies als einzelne, einmalige Routenkonfiguration zu tun.
' /Example/Scripts/*.js
<Route("Example/Scripts/{filename}")>
Function Scripts(filename As String) As ActionResult
' ControllerName could be hardcoded but doing it this way allows for copy/pasting this code block into other controllers without having to edit
Dim ControllerName As String = System.Web.HttpContext.Current.Request.RequestContext.RouteData.Values("controller").ToString()
' the real file path
Dim filePath As String = Server.MapPath("~/Views/" & ControllerName & "/" & filename)
' send the file contents back
Return Content(System.IO.File.ReadAllText(filePath), "text/javascript")
End Function
Für den Kontext ist dies meine ExampleController.vb-Datei:
Imports System.Web.Mvc
Namespace myAppName
Public Class ExampleController
Inherits Controller
' /Example/Test
Function Test() As ActionResult
Return View()
End Function
' /Example/Scripts/*.js
<Route("Example/Scripts/{filename}")>
Function Scripts(filename As String) As ActionResult
' ControllerName could be hardcoded but doing it this way allows for copy/pasting this code block into other controllers without having to edit
Dim ControllerName As String = System.Web.HttpContext.Current.Request.RequestContext.RouteData.Values("controller").ToString()
' the real file path
Dim filePath As String = Server.MapPath("~/Views/" & ControllerName & "/" & filename)
' send the file contents back
Return Content(System.IO.File.ReadAllText(filePath), "text/javascript")
End Function
End Class
End Namespace
Schlussbemerkungen
Die Javascript-Dateien von test.vbhtml view / test.js enthalten nichts Besonderes und werden hier nicht angezeigt.
Ich behalte mein CSS in der Ansichtsdatei, aber Sie können diese Lösung problemlos ergänzen, damit Sie auf ähnliche Weise auf Ihre CSS-Dateien verweisen können.