Saya juga ingin menempatkan file js yang terkait dengan tampilan di folder yang sama dengan tampilan.
Saya tidak bisa mendapatkan solusi lain di utas ini untuk berfungsi, bukan karena mereka rusak tetapi saya terlalu baru di MVC untuk membuatnya berfungsi.
Menggunakan informasi yang diberikan di sini dan beberapa tumpukan lainnya, saya menemukan solusi yang:
- Mengizinkan file javascript untuk ditempatkan di direktori yang sama dengan tampilan yang terkait dengannya.
- URL skrip tidak memberikan struktur situs fisik yang mendasarinya
- URL skrip tidak harus diakhiri dengan garis miring (/)
- Tidak mengganggu sumber daya statis, misalnya: /Scripts/someFile.js masih berfungsi
- Tidak membutuhkan runAllManagedModulesForAllRequests untuk diaktifkan.
Catatan: Saya juga menggunakan HTTP Attribute Routing. Ada kemungkinan bahwa rute yang digunakan di soultion saya dapat dimodifikasi untuk bekerja tanpa mengaktifkan ini.
Diberikan contoh struktur direktori / file berikut:
Controllers
-- Example
-- ExampleController.vb
Views
-- Example
-- Test.vbhtml
-- Test.js
Dengan menggunakan langkah-langkah konfigurasi yang diberikan di bawah ini, dikombinasikan dengan contoh struktur di atas, URL tampilan pengujian akan diakses melalui: /Example/Testdan file javascript akan direferensikan melalui:/Example/Scripts/test.js
Langkah 1 - Aktifkan Perutean Atribut:
Edit file /App_start/RouteConfig.vb Anda dan tambahkan routes.MapMvcAttributeRoutes()tepat di atas rute yang ada.
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
Langkah 2 -Konfigurasi situs Anda untuk memperlakukan, dan memproses, /{controller}/Scripts/*.js sebagai jalur MVC dan bukan sumber daya statis
Edit file /Web.config Anda, tambahkan yang berikut ini ke bagian system.webServer -> handlers dari file:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Ini dia lagi dengan konteks:
<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>
Langkah 3 - Tambahkan hasil tindakan skrip berikut ke file Controller Anda
- Pastikan untuk mengedit jalur rute agar cocok dengan nama {controller} untuk controller, untuk contoh ini: <Route (" Example / Scripts / {filename}")>
Anda perlu menyalin ini ke setiap file Controller Anda. Jika Anda ingin, mungkin ada cara untuk melakukan ini sebagai konfigurasi rute tunggal, satu kali, entah bagaimana.
' /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
Untuk konteksnya, ini adalah file ExampleController.vb saya:
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
Catatan Akhir
Tidak ada yang istimewa tentang file javascript test.vbhtml view / test.js dan tidak ditampilkan di sini.
Saya menyimpan CSS saya dalam file tampilan tetapi Anda dapat dengan mudah menambahkan solusi ini sehingga Anda dapat mereferensikan file CSS Anda dengan cara yang sama.