ฉันยังต้องการวางไฟล์ js ที่เกี่ยวข้องกับมุมมองในโฟลเดอร์เดียวกับมุมมอง
ฉันไม่สามารถใช้วิธีแก้ปัญหาอื่น ๆ ในเธรดนี้ได้ไม่ใช่ว่าพวกเขาเสีย แต่ฉันยังใหม่เกินไปสำหรับ MVC ที่จะทำให้พวกเขาทำงานได้
การใช้ข้อมูลที่ให้ไว้ที่นี่และสแต็คอื่น ๆ ฉันได้หาวิธีแก้ปัญหาที่:
- อนุญาตให้วางไฟล์ javascript ในไดเร็กทอรีเดียวกับมุมมองที่เชื่อมโยง
- URL ของสคริปต์ไม่ได้ให้โครงสร้างของไซต์จริง
- URL ของสคริปต์ไม่จำเป็นต้องลงท้ายด้วยเครื่องหมายทับ (/)
- ไม่รบกวนทรัพยากรแบบคงที่เช่น /Scripts/someFile.js ยังคงใช้งานได้
- ไม่ต้องการให้เปิดใช้งาน runAllManagedModulesForAllRequests
หมายเหตุ: ฉันใช้ HTTP Attribute Routing ด้วย เป็นไปได้ว่าเส้นทางที่ใช้ในจิตวิญญาณของฉันสามารถแก้ไขให้ทำงานได้โดยไม่ต้องเปิดใช้งานสิ่งนี้
ระบุไดเร็กทอรี / โครงสร้างไฟล์ตัวอย่างต่อไปนี้:
Controllers
Views
เมื่อใช้ขั้นตอนการกำหนดค่าที่ระบุด้านล่างรวมกับโครงสร้างตัวอย่างด้านบน URL ของมุมมองทดสอบจะเข้าถึงได้ผ่าน: /Example/Test
และไฟล์ javascript จะถูกอ้างอิงผ่าน:/Example/Scripts/test.js
ขั้นตอนที่ 1 - เปิดใช้งานการกำหนดเส้นทางแอตทริบิวต์:
แก้ไขไฟล์ /App_start/RouteConfig.vb ของคุณและเพิ่มroutes.MapMvcAttributeRoutes()
เหนือเส้นทางที่มีอยู่ 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
ขั้นตอนที่ 2 - กำหนดค่าไซต์ของคุณเพื่อปฏิบัติและประมวลผล /{controller}/Scripts/*.js เป็นเส้นทาง MVC ไม่ใช่ทรัพยากรแบบคงที่
แก้ไขไฟล์ /Web.config ของคุณเพิ่มสิ่งต่อไปนี้ในส่วน system.webServer -> ตัวจัดการของไฟล์:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
นี่คืออีกครั้งพร้อมบริบท:
<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>
ขั้นตอนที่ 3 - เพิ่มผลการดำเนินการสคริปต์ต่อไปนี้ลงในไฟล์คอนโทรลเลอร์ของคุณ
- อย่าลืมแก้ไขเส้นทางของเส้นทางให้ตรงกับชื่อ {controller} สำหรับคอนโทรลเลอร์สำหรับตัวอย่างนี้คือ <Route (" Example / Scripts / {filename}")>
คุณจะต้องคัดลอกสิ่งนี้ลงในไฟล์ Controller แต่ละไฟล์ของคุณ หากคุณต้องการอาจมีวิธีดำเนินการโดยใช้การกำหนดค่าเส้นทางแบบครั้งเดียวครั้งเดียว
<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
สำหรับบริบทนี่คือไฟล์ 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
หมายเหตุสุดท้าย
ไม่มีอะไรพิเศษเกี่ยวกับไฟล์จาวาสคริปต์ test.vbhtml view / test.js และจะไม่แสดงที่นี่
ฉันเก็บ CSS ไว้ในไฟล์มุมมอง แต่คุณสามารถเพิ่มลงในโซลูชันนี้ได้อย่างง่ายดายเพื่อให้คุณสามารถอ้างอิงไฟล์ CSS ของคุณในลักษณะเดียวกัน