Я также хотел поместить файлы js, относящиеся к представлению, в ту же папку, что и представление.
Мне не удалось заставить другие решения в этой теме работать, не то чтобы они сломались, но я слишком новичок в MVC, чтобы заставить их работать.
Используя приведенную здесь информацию и несколько других стеков, я нашел решение, которое:
- Позволяет поместить файл javascript в тот же каталог, что и представление, с которым он связан.
- URL-адреса сценариев не выделяют базовую физическую структуру сайта
- URL скрипта не должны заканчиваться косой чертой (/)
- Не мешает статическим ресурсам, например: /Scripts/someFile.js still
работы
- Не требует включения 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 - Сконфигурируйте ваш сайт для обработки и обработки / averagecontroller innovative/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} для
контроллер, для этого примера это:
<Маршрута ( "<strong> Пример * * тысячу пятьдесят-две / скрипты / {имя файла}")>
Вам нужно будет скопировать это в каждый из ваших файлов контроллера. Если вы хотите, возможно, есть способ сделать это как единовременную конфигурацию маршрута.
' /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
Заключительные замечания
В файлах javascript test.vbhtml view / test.js нет ничего особенного, и они здесь не показаны.
Я держу свой CSS в файле представления, но вы можете легко добавить к этому решению, чтобы вы могли ссылаться на ваши файлы CSS аналогичным образом.