Chciałem również umieścić pliki js związane z widokiem w tym samym folderze co widok.
Nie byłem w stanie uruchomić innych rozwiązań w tym wątku, nie dlatego, że są zepsute, ale jestem zbyt nowy w MVC, aby je uruchomić.
Korzystając z informacji podanych tutaj i kilku innych stosów, opracowałem rozwiązanie, które:
- Umożliwia umieszczenie pliku javascript w tym samym katalogu, z którym jest powiązany widok.
- Adresy URL skryptów nie ujawniają podstawowej struktury fizycznej witryny
- Adresy URL skryptu nie muszą kończyć się końcowym ukośnikiem (/)
- Nie koliduje ze statycznymi zasobami, np .: /Scripts/someFile.js nadal działa
- Nie wymaga włączenia runAllManagedModulesForAllRequests.
Uwaga: używam również routingu atrybutów HTTP. Możliwe, że trasa używana w mojej opinii może zostać zmodyfikowana, aby działała bez włączania tego.
Biorąc pod uwagę następującą przykładową strukturę katalogów / plików:
Controllers
Views
Korzystając z kroków konfiguracyjnych podanych poniżej, w połączeniu z powyższą przykładową strukturą, dostęp do adresu URL widoku testowego można uzyskać za pośrednictwem:, /Example/Test
a odwołanie do pliku javascript byłoby dostępne za pośrednictwem:/Example/Scripts/test.js
Krok 1 - Włącz routing atrybutów:
Edytuj swój plik /App_start/RouteConfig.vb i dodaj routes.MapMvcAttributeRoutes()
tuż nad istniejącymi trasami.
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
Krok 2 - Skonfiguruj witrynę tak, aby traktowała i przetwarzała /{controller}/Scripts/*.js jako ścieżkę MVC, a nie zasób statyczny
Edytuj swój plik /Web.config, dodając następujące elementy do sekcji system.webServer -> handlers pliku:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Oto znowu z kontekstem:
<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>
Krok 3 - Dodaj wynik działania następującego skryptu do pliku kontrolera
- Pamiętaj, aby edytować ścieżkę trasy, aby pasowała do nazwy {kontrolera} kontrolera, w tym przykładzie jest to: <Route (" Example / Scripts / {filename}")>
Będziesz musiał skopiować to do każdego z plików kontrolera. Jeśli chcesz, prawdopodobnie jest sposób na zrobienie tego jako pojedynczej, jednorazowej konfiguracji trasy.
<Route("Example/Scripts/{filename}")>
Function Scripts(filename As String) As ActionResult
Dim ControllerName As String = System.Web.HttpContext.Current.Request.RequestContext.RouteData.Values("controller").ToString()
Dim filePath As String = Server.MapPath("~/Views/" & ControllerName & "/" & filename)
Return Content(System.IO.File.ReadAllText(filePath), "text/javascript")
End Function
W kontekście jest to mój plik ExampleController.vb:
Imports System.Web.Mvc
Namespace myAppName
Public Class ExampleController
Inherits Controller
Function Test() As ActionResult
Return View()
End Function
<Route("Example/Scripts/{filename}")>
Function Scripts(filename As String) As ActionResult
Dim ControllerName As String = System.Web.HttpContext.Current.Request.RequestContext.RouteData.Values("controller").ToString()
Dim filePath As String = Server.MapPath("~/Views/" & ControllerName & "/" & filename)
Return Content(System.IO.File.ReadAllText(filePath), "text/javascript")
End Function
End Class
End Namespace
Uwagi końcowe
Nie ma nic specjalnego w plikach javascript test.vbhtml view / test.js i nie są one tutaj pokazane.
Trzymam mój CSS w pliku widoku, ale możesz łatwo dodać to rozwiązanie, abyś mógł odwoływać się do swoich plików CSS w podobny sposób.