Tôi cũng muốn đặt các tệp js liên quan đến một chế độ xem trong cùng một thư mục với chế độ xem.
Tôi không thể làm cho các giải pháp khác trong chuỗi này hoạt động, không phải là chúng bị hỏng nhưng tôi quá mới đối với MVC để làm cho chúng hoạt động.
Sử dụng thông tin được cung cấp ở đây và một số ngăn xếp khác, tôi đã đưa ra một giải pháp:
- Cho phép đặt tệp javascript trong cùng thư mục với chế độ xem mà nó được liên kết.
- URL tập lệnh không cung cấp cấu trúc trang web vật lý cơ bản
- URL tập lệnh không cần phải kết thúc bằng dấu gạch chéo (/)
- Không can thiệp vào tài nguyên tĩnh, ví dụ: /Scripts/someFile.js vẫn hoạt động
- Không yêu cầu runAllManagedModulesForAllRequests được bật.
Lưu ý: Tôi cũng đang sử dụng Định tuyến thuộc tính HTTP. Có thể tuyến đường được sử dụng trong linh hồn của tôi có thể được sửa đổi để hoạt động mà không cần kích hoạt điều này.
Đưa ra cấu trúc thư mục / tệp ví dụ sau:
Controllers
-- Example
-- ExampleController.vb
Views
-- Example
-- Test.vbhtml
-- Test.js
Sử dụng các bước cấu hình được cung cấp bên dưới, kết hợp với cấu trúc ví dụ ở trên, URL chế độ xem thử nghiệm sẽ được truy cập qua: /Example/Test
và tệp javascript sẽ được tham chiếu qua:/Example/Scripts/test.js
Bước 1 - Bật định tuyến thuộc tính:
Chỉnh sửa tệp /App_start/RouteConfig.vb của bạn và thêm routes.MapMvcAttributeRoutes()
ngay phía trên các tuyến đường hiện có.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
Bước 2 -Cấu hình trang web của bạn để xử lý và xử lý /{controller}/Scripts/*.js dưới dạng đường dẫn MVC chứ không phải tài nguyên tĩnh
Chỉnh sửa tệp /Web.config của bạn, thêm phần sau vào phần system.webServer -> trình xử lý của tệp:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Đây là một lần nữa với ngữ cảnh:
<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>
Bước 3 - Thêm kết quả hành động tập lệnh sau vào tệp Bộ điều khiển của bạn
- Đảm bảo chỉnh sửa đường dẫn tuyến để khớp với tên {controller} của bộ điều khiển, ví dụ này là: <Route (" Ví dụ / Scripts / {filename}")>
Bạn sẽ cần sao chép tệp này vào từng tệp Bộ điều khiển của mình. Nếu bạn muốn, có lẽ có một cách để thực hiện việc này dưới dạng cấu hình tuyến đường đơn lẻ, một lần, bằng cách nào đó.
' /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
Đối với ngữ cảnh, đây là tệp ExampleController.vb của tôi:
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
Ghi chú cuối cùng
Không có gì đặc biệt về các tệp javascript test.vbhtml view / test.js và không được hiển thị ở đây.
Tôi giữ CSS của mình trong tệp xem nhưng bạn có thể dễ dàng thêm vào giải pháp này để bạn có thể tham chiếu các tệp CSS của mình theo cách tương tự.