Volevo anche posizionare i file js relativi a una vista nella stessa cartella della vista.
Non sono riuscito a far funzionare le altre soluzioni in questo thread, non che siano interrotte ma sono troppo nuovo per MVC per farle funzionare.
Utilizzando le informazioni fornite qui e molti altri stack, ho trovato una soluzione che:
- Consente al file javascript di essere posizionato nella stessa directory della vista a cui è associato.
- Gli URL degli script non rivelano la struttura fisica del sito sottostante
- Gli URL dello script non devono terminare con una barra finale (/)
- Non interferisce con le risorse statiche, ad esempio: /Scripts/someFile.js funziona ancora
- Non richiede l'abilitazione di runAllManagedModulesForAllRequests.
Nota: utilizzo anche il routing degli attributi HTTP. È possibile che il percorso utilizzato nella mia anima possa essere modificato per funzionare senza abilitarlo.
Dato il seguente esempio di struttura di directory / file:
Controllers
-- Example
-- ExampleController.vb
Views
-- Example
-- Test.vbhtml
-- Test.js
Utilizzando i passaggi di configurazione indicati di seguito, combinati con la struttura di esempio sopra, si accederà all'URL della vista di prova tramite: /Example/Test
e si farebbe riferimento al file javascript tramite:/Example/Scripts/test.js
Passaggio 1: abilita il routing degli attributi:
Modifica il tuo file /App_start/RouteConfig.vb e aggiungilo routes.MapMvcAttributeRoutes()
appena sopra i percorsi esistenti.
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
Passaggio 2: configura il tuo sito per trattare ed elaborare /{controller}/Scripts/*.js come un percorso MVC e non come una risorsa statica
Modifica il tuo file /Web.config, aggiungendo quanto segue alla sezione system.webServer -> handlers del file:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Eccolo di nuovo con il contesto:
<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>
Passaggio 3: aggiungere il seguente risultato dell'azione degli script al file del controller
- Assicurati di modificare il percorso della rotta in modo che corrisponda al nome {controller} per il controller, per questo esempio è: <Route (" Example / Scripts / {filename}")>
Dovrai copiarlo in ciascuno dei tuoi file Controller. Se lo desideri, probabilmente c'è un modo per farlo come una singola configurazione di rotta in qualche modo.
' /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
Per contesto, questo è il mio file 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
Note finali
Non c'è niente di speciale nei file javascript test.vbhtml view / test.js e non sono mostrati qui.
Conservo il mio CSS nel file di visualizzazione, ma potresti facilmente aggiungere a questa soluzione in modo da poter fare riferimento ai tuoi file CSS in modo simile.