<% '======================================================================================================================= ' ROUTING HELPER ' Provides URL generation for RouteKit framework '======================================================================================================================= Class Route_Helper_Class Private m_app_url Private m_content_url Private m_stylesheets_url Private m_js_url Private m_images_url Private m_enable_cache_busting Private m_cache_bust_param_name Private Sub Class_Initialize() ' Auto-detect application URL from current request Dim protocol, host, appPath protocol = IIf(Request.ServerVariables("HTTPS") = "on", "https://", "http://") host = Request.ServerVariables("HTTP_HOST") appPath = Request.ServerVariables("APPL_MD_PATH") ' Extract virtual directory from IIS path Dim vdir vdir = "" If InStr(appPath, "/LM/W3SVC/") > 0 Then vdir = Mid(appPath, InStrRev(appPath, "/") + 1) If vdir <> "ROOT" Then vdir = "/" & vdir Else vdir = "" End If End If m_app_url = protocol & host & vdir & "/" m_content_url = m_app_url & "content/" m_stylesheets_url = m_app_url & "css/" m_js_url = m_app_url & "js/" m_images_url = m_app_url & "images/" ' Load cache-busting configuration Dim cacheBustSetting cacheBustSetting = GetAppSetting("EnableCacheBusting") m_enable_cache_busting = (cacheBustSetting = "true" Or cacheBustSetting = "True") ' Get cache-bust parameter name (default: "v") m_cache_bust_param_name = GetAppSetting("CacheBustParamName") If m_cache_bust_param_name = "nothing" Or Len(m_cache_bust_param_name) = 0 Then m_cache_bust_param_name = "v" End If End Sub '--------------------------------------------------------------------------------------------------------------------- ' Cache-busting token (timestamp-based for uniqueness) '--------------------------------------------------------------------------------------------------------------------- Public Property Get NoCacheToken NoCacheToken = CLng(Timer() * 100) End Property '--------------------------------------------------------------------------------------------------------------------- ' Check if cache-busting is globally enabled '--------------------------------------------------------------------------------------------------------------------- Public Property Get CacheBustingEnabled CacheBustingEnabled = m_enable_cache_busting End Property '--------------------------------------------------------------------------------------------------------------------- ' Get/Set cache-busting enabled (can override config at runtime) '--------------------------------------------------------------------------------------------------------------------- Public Property Let CacheBustingEnabled(value) m_enable_cache_busting = value End Property '--------------------------------------------------------------------------------------------------------------------- ' URL Properties '--------------------------------------------------------------------------------------------------------------------- Public Property Get AppURL AppURL = m_app_url End Property Public Property Get ContentURL ContentURL = m_content_url End Property Public Property Get StylesheetsURL StylesheetsURL = m_stylesheets_url End Property Public Property Get JsURL JsURL = m_js_url End Property Public Property Get ImagesURL ImagesURL = m_images_url End Property '--------------------------------------------------------------------------------------------------------------------- ' Generate clean URL for controller/action (RouteKit style) ' ' @param controller_name String Name of controller (without "Controller" suffix) ' @param action_name String Name of action method ' @param params_array KV Array Optional key/value pair array for query string ' @returns String Clean URL like "/controller/action?key=val" '--------------------------------------------------------------------------------------------------------------------- Public Function UrlTo(controller_name, action_name, params_array) Dim url, qs ' Build clean URL: /controller/action url = m_app_url & LCase(controller_name) & "/" & LCase(action_name) ' Add query string parameters if provided qs = TO_Querystring(params_array) If Len(qs) > 0 Then url = url & "?" & qs End If UrlTo = url End Function '--------------------------------------------------------------------------------------------------------------------- ' Generate URL with route parameters (e.g., /users/show/123) ' ' @param controller_name String Name of controller ' @param action_name String Name of action method ' @param route_params Array Route parameters (e.g., Array(123) for ID) ' @param query_params KV Array Optional query string parameters ' @returns String URL with route params '--------------------------------------------------------------------------------------------------------------------- Public Function UrlToWithParams(controller_name, action_name, route_params, query_params) Dim url, qs, i ' Build base URL url = m_app_url & LCase(controller_name) & "/" & LCase(action_name) ' Append route parameters If IsArray(route_params) Then For i = 0 To UBound(route_params) url = url & "/" & Server.URLEncode(CStr(route_params(i))) Next ElseIf Not IsEmpty(route_params) Then url = url & "/" & Server.URLEncode(CStr(route_params)) End If ' Add query string parameters if provided qs = TO_Querystring(query_params) If Len(qs) > 0 Then url = url & "?" & qs End If UrlToWithParams = url End Function '--------------------------------------------------------------------------------------------------------------------- ' Generate URL for static asset with cache-busting ' ' @param asset_path String Relative path to asset (e.g., "css/site.css") ' @param use_cache_bust Variant Boolean or Empty. If Empty, uses global setting. If True/False, overrides. ' @returns String Full URL to asset '--------------------------------------------------------------------------------------------------------------------- Public Function AssetUrl(asset_path, use_cache_bust) Dim url, shouldBust url = m_app_url & asset_path ' Determine if we should cache-bust If IsEmpty(use_cache_bust) Then shouldBust = m_enable_cache_busting Else shouldBust = CBool(use_cache_bust) End If If shouldBust Then url = AppendCacheBustParam(url) End If AssetUrl = url End Function '--------------------------------------------------------------------------------------------------------------------- ' Generate URL for route with optional cache-busting ' ' @param controller_name String Name of controller ' @param action_name String Name of action ' @param params_array KV Array Optional query params ' @param use_cache_bust Variant Boolean or Empty. If Empty, uses global setting ' @returns String URL with optional cache-busting '--------------------------------------------------------------------------------------------------------------------- Public Function UrlToWithCacheBust(controller_name, action_name, params_array, use_cache_bust) Dim url url = UrlTo(controller_name, action_name, params_array) ' Determine if we should cache-bust Dim shouldBust If IsEmpty(use_cache_bust) Then shouldBust = m_enable_cache_busting Else shouldBust = CBool(use_cache_bust) End If If shouldBust Then url = AppendCacheBustParam(url) End If UrlToWithCacheBust = url End Function '--------------------------------------------------------------------------------------------------------------------- ' PRIVATE HELPER METHODS '--------------------------------------------------------------------------------------------------------------------- Private Function TO_Querystring(the_array) Dim result, idx result = "" If Not IsEmpty(the_array) And IsArray(the_array) Then ' Process key-value pairs (array with even number of elements) For idx = LBound(the_array) To UBound(the_array) Step 2 If idx + 1 <= UBound(the_array) Then result = result & GetParam(the_array, idx) ' Append & between parameters, but not on the last parameter If Not (idx >= UBound(the_array) - 1) Then result = result & "&" End If End If Next End If TO_Querystring = result End Function Private Function GetParam(params_array, key_idx) Dim key, val key = Server.URLEncode(CStr(params_array(key_idx))) val = Server.URLEncode(CStr(params_array(key_idx + 1))) GetParam = key & "=" & val End Function Private Function AppendCacheBustParam(url) Dim separator ' Determine if we need ? or & If InStr(url, "?") > 0 Then separator = "&" Else separator = "?" End If AppendCacheBustParam = url & separator & m_cache_bust_param_name & "=" & NoCacheToken End Function End Class '--------------------------------------------------------------------------------------------------------------------- ' Singleton accessor '--------------------------------------------------------------------------------------------------------------------- Dim Route_Helper__Singleton Set Route_Helper__Singleton = Nothing Function Routes() If Route_Helper__Singleton Is Nothing Then Set Route_Helper__Singleton = New Route_Helper_Class End If Set Routes = Route_Helper__Singleton End Function %>