Je voulais également placer les fichiers js liés à une vue dans le même dossier que la vue.
Je n'ai pas pu faire fonctionner les autres solutions de ce fil, non pas qu'elles soient cassées, mais je suis trop novice dans MVC pour les faire fonctionner.
En utilisant les informations données ici et plusieurs autres piles, j'ai trouvé une solution qui:
- Permet au fichier javascript d'être placé dans le même répertoire que la vue à laquelle il est associé.
- Les URL de script ne révèlent pas la structure physique sous-jacente du site
- Les URL de script ne doivent pas nécessairement se terminer par une barre oblique (/)
- N'interfère pas avec les ressources statiques, par exemple: /Scripts/someFile.js fonctionne toujours
- Ne nécessite pas l'activation de runAllManagedModulesForAllRequests.
Remarque: j'utilise également le routage d'attributs HTTP. Il est possible que l'itinéraire utilisé dans mon âme puisse être modifié pour fonctionner sans l'activer.
Compte tenu de l'exemple de structure de répertoire / fichier suivant:
Controllers
-- Example
-- ExampleController.vb
Views
-- Example
-- Test.vbhtml
-- Test.js
En utilisant les étapes de configuration ci-dessous, combinées à l'exemple de structure ci-dessus, l'URL de la vue de test serait accessible via: /Example/Test
et le fichier javascript serait référencé via:/Example/Scripts/test.js
Étape 1 - Activer le routage d'attributs:
Modifiez votre fichier /App_start/RouteConfig.vb et ajoutez routes.MapMvcAttributeRoutes()
juste au-dessus des routes existantes.
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
Étape 2 -Configurez votre site pour traiter et traiter /{controller}/Scripts/*.js comme un chemin MVC et non comme une ressource statique
Modifiez votre fichier /Web.config, en ajoutant ce qui suit à la section system.webServer -> handlers du fichier:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Le voici encore avec le contexte:
<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>
Étape 3 - Ajoutez le résultat de l'action de scripts suivant à votre fichier Controller
- Assurez-vous de modifier le chemin de la route pour qu'il corresponde au nom du {contrôleur} du contrôleur, pour cet exemple, il s'agit de: <Route (" Example / Scripts / {filename}")>
Vous devrez le copier dans chacun de vos fichiers Controller. Si vous le souhaitez, il existe probablement un moyen de le faire en tant que configuration de route unique et unique.
' /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
Pour le contexte, voici mon fichier ExampleController.vb:
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
Notes finales
Il n'y a rien de spécial à propos des fichiers javascript test.vbhtml view / test.js et ne sont pas affichés ici.
Je garde mon CSS dans le fichier de vue mais vous pouvez facilement ajouter à cette solution afin que vous puissiez référencer vos fichiers CSS de la même manière.