Ayrıca bir görünümle ilgili js dosyalarını görünümle aynı klasöre yerleştirmek istedim.
Bu iş parçacığındaki diğer çözümlerin çalışmasını sağlayamadım, bozuk oldukları için değil ama MVC'de onları çalıştırmak için çok yeniyim.
Burada verilen bilgileri ve diğer birkaç yığını kullanarak şu özelliklere sahip bir çözüm buldum:
- Javascript dosyasının ilişkili olduğu görünümle aynı dizine yerleştirilmesine izin verir.
- Komut dosyası URL'leri, temeldeki fiziksel site yapısını vermez
- Komut dosyası URL’lerinin sonda eğik çizgi (/) ile bitmesi gerekmez
- Statik kaynaklara müdahale etmez, örneğin: /Scripts/someFile.js hala çalışıyor
- RunAllManagedModulesForAllRequests'in etkinleştirilmesini gerektirmez.
Not: Ayrıca HTTP Öznitelik Yönlendirme kullanıyorum. Benim ruhumda kullanılan rotanın, bunu etkinleştirmeden çalışacak şekilde değiştirilebilmesi mümkündür.
Aşağıdaki örnek dizin / dosya yapısı göz önüne alındığında:
Controllers
Views
Aşağıda verilen yapılandırma adımlarını kullanarak, yukarıdaki örnek yapıyla birlikte, test görünümü URL'sine şu yolla erişilebilir: /Example/Test
ve javascript dosyasına şu yolla başvurulur:/Example/Scripts/test.js
Adım 1 - Öznitelik Yönlendirmeyi Etkinleştirin:
/App_start/RouteConfig.vb dosyanızı düzenleyin ve routes.MapMvcAttributeRoutes()
mevcut rotaların hemen üstüne ekleyin.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. Adım - Sitenizi, /{controller}/Scripts/*.js'yi statik bir kaynak değil, MVC yolu olarak ele alacak ve işleyecek şekilde yapılandırın
Aşağıdakileri dosyanın system.webServer -> işleyiciler bölümüne ekleyerek /Web.config dosyanızı düzenleyin:
<add name="ApiURIs-ISAPI-Integrated-4.0" path="*/scripts/*.js" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
İşte yine bağlamla:
<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>
Adım 3 - Aşağıdaki komut dosyası eylem sonucunu Denetleyici dosyanıza ekleyin
- Yol yolunu denetleyicinin {controller} adıyla eşleşecek şekilde düzenlediğinizden emin olun, bu örnek için: <Route (" Example / Scripts / {filename}")>
Bunu Kontrolör dosyalarınızın her birine kopyalamanız gerekecek. İsterseniz, muhtemelen bunu tek, tek seferlik bir rota yapılandırması olarak yapmanın bir yolu vardır.
<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
Bağlam için, bu benim ExampleController.vb dosyam:
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
Son Notlar
test.vbhtml view / test.js javascript dosyalarıyla ilgili özel bir şey yoktur ve burada gösterilmez.
CSS'mi görünüm dosyasında tutuyorum, ancak CSS dosyalarınıza benzer bir şekilde başvurabilmeniz için bu çözüme kolayca ekleyebilirsiniz.