또한 뷰와 동일한 폴더에 뷰와 관련된 js 파일을 배치하고 싶었습니다.
이 스레드의 다른 솔루션이 작동하도록 할 수 없었습니다. 고장난 것이 아니라 MVC를 처음 사용하여 작동하도록 만들 수 없습니다.
여기에 제공된 정보와 몇 가지 다른 스택을 사용하여 다음과 같은 솔루션을 찾았습니다.
- javascript 파일이 연관된보기와 동일한 디렉토리에 배치되도록 허용합니다.
- 스크립트 URL은 기본 물리적 사이트 구조를 제공하지 않습니다.
- 스크립트 URL은 후행 슬래시 (/)로 끝나지 않아도됩니다.
- 정적 리소스를 방해하지 않습니다. 예 : /Scripts/someFile.js는 여전히 작동합니다.
- runAllManagedModulesForAllRequests를 활성화 할 필요가 없습니다.
참고 : HTTP 속성 라우팅도 사용하고 있습니다. 내 영혼에 사용 된 경로를 활성화하지 않고도 작동하도록 수정할 수 있습니다.
다음 예제 디렉토리 / 파일 구조가 제공됩니다.
Controllers
-- Example
-- ExampleController.vb
Views
-- Example
-- Test.vbhtml
-- Test.js
아래에 제공된 구성 단계를 위의 예제 구조와 결합하여 테스트보기 URL에 다음을 통해 액세스 /Example/Test
하고 javascript 파일은 다음을 통해 참조합니다./Example/Scripts/test.js
1 단계-속성 라우팅 활성화 :
/App_start/RouteConfig.vb 파일을 편집 routes.MapMvcAttributeRoutes()
하고 기존 경로 바로 위에 추가 합니다.
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-> handlers 섹션에 다음을 추가하십시오.
<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}")>
이것을 각 컨트롤러 파일에 복사해야합니다. 원하는 경우 단일, 일회성 경로 구성으로이 작업을 수행 할 수있는 방법이 있습니다.
' /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
컨텍스트의 경우 이것은 내 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
최종 노트
test.vbhtml view / test.js javascript 파일에는 특별한 것이 없으며 여기에 표시되지 않습니다.
내 CSS를보기 파일에 보관하지만이 솔루션에 쉽게 추가하여 비슷한 방식으로 CSS 파일을 참조 할 수 있습니다.