// This method returns a new RouteCollection containing only routes that matched a particular area. // The Boolean out parameter is just a flag specifying whether any registered routes were area-aware. private static RouteCollection FilterRouteCollectionByArea(RouteCollection routes, string areaName, out bool usingAreas) { if (areaName == null) { areaName = String.Empty; } usingAreas = false; RouteCollection filteredRoutes = new RouteCollection(); using (routes.GetReadLock()) { foreach (RouteBase route in routes) { string thisAreaName = AreaHelpers.GetAreaName(route) ?? String.Empty; usingAreas |= (thisAreaName.Length > 0); if (String.Equals(thisAreaName, areaName, StringComparison.OrdinalIgnoreCase)) { filteredRoutes.Add(route); } } } // if areas are not in use, the filtered route collection might be incorrect return((usingAreas) ? filteredRoutes : routes); }
private string GetPath(ControllerContext controllerContext, string[] locations, string[] areaLocations, string locationsPropertyName, string name, string controllerName, string cacheKeyPrefix, bool useCache, out string[] searchedLocations) { searchedLocations = _emptyLocations; if (String.IsNullOrEmpty(name)) { return(String.Empty); } string areaName = AreaHelpers.GetAreaName(controllerContext.RouteData); bool usingAreas = !String.IsNullOrEmpty(areaName); List <ViewLocation> viewLocations = GetViewLocations(locations, (usingAreas) ? areaLocations : null); if (viewLocations.Count == 0) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture, MvcResources.Common_PropertyCannotBeNullOrEmpty, locationsPropertyName)); } bool nameRepresentsPath = IsSpecificPath(name); string cacheKey = CreateCacheKey(cacheKeyPrefix, name, (nameRepresentsPath) ? String.Empty : controllerName, areaName); if (useCache) { return(ViewLocationCache.GetViewLocation(controllerContext.HttpContext, cacheKey)); } return((nameRepresentsPath) ? GetPathFromSpecificName(controllerContext, name, cacheKey, ref searchedLocations) : GetPathFromGeneralName(controllerContext, viewLocations, name, controllerName, areaName, cacheKey, ref searchedLocations)); }
// This method returns a new RouteCollection containing only routes that matched a particular area. // The Boolean out parameter is just a flag specifying whether any registered routes were area-aware. private static RouteCollection FilterRouteCollectionByArea(RouteCollection routes, string areaName, out bool usingAreas) { if (areaName == null) { areaName = String.Empty; } usingAreas = false; // Ensure that we continue using the same settings as the previous route collection // if we are using areas and the route collection is exchanged RouteCollection filteredRoutes = new RouteCollection() { AppendTrailingSlash = routes.AppendTrailingSlash, LowercaseUrls = routes.LowercaseUrls, RouteExistingFiles = routes.RouteExistingFiles }; using (routes.GetReadLock()) { foreach (RouteBase route in routes) { string thisAreaName = AreaHelpers.GetAreaName(route) ?? String.Empty; usingAreas |= (thisAreaName.Length > 0); if (String.Equals(thisAreaName, areaName, StringComparison.OrdinalIgnoreCase)) { filteredRoutes.Add(route); } } } // if areas are not in use, the filtered route collection might be incorrect return((usingAreas) ? filteredRoutes : routes); }
private string GetPath(ControllerContext controllerContext, string[] locations, string[] areaLocations, string locationsPropertyName, string name, string controllerName, string cacheKeyPrefix, bool useCache, out string[] searchedLocations) { searchedLocations = _emptyLocations; if (String.IsNullOrEmpty(name)) { return(String.Empty); } string areaName = AreaHelpers.GetAreaName(controllerContext.RouteData); bool usingAreas = !String.IsNullOrEmpty(areaName); List <ViewLocation> viewLocations = GetViewLocations(locations, (usingAreas) ? areaLocations : null); if (viewLocations.Count == 0) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, MvcResources.Common_PropertyCannotBeNullOrEmpty, locationsPropertyName)); } bool nameRepresentsPath = IsSpecificPath(name); string cacheKey = CreateCacheKey(cacheKeyPrefix, name, (nameRepresentsPath) ? String.Empty : controllerName, areaName); if (useCache) { // Only look at cached display modes that can handle the context. IEnumerable <IDisplayMode> possibleDisplayModes = DisplayModeProvider.GetAvailableDisplayModesForContext(controllerContext.HttpContext, controllerContext.DisplayMode); foreach (IDisplayMode displayMode in possibleDisplayModes) { string cachedLocation = ViewLocationCache.GetViewLocation(controllerContext.HttpContext, AppendDisplayModeToCacheKey(cacheKey, displayMode.DisplayModeId)); if (cachedLocation == null) { // If any matching display mode location is not in the cache, fall back to the uncached behavior, which will repopulate all of our caches. return(null); } // A non-empty cachedLocation indicates that we have a matching file on disk. Return that result. if (cachedLocation.Length > 0) { if (controllerContext.DisplayMode == null) { controllerContext.DisplayMode = displayMode; } return(cachedLocation); } // An empty cachedLocation value indicates that we don't have a matching file on disk. Keep going down the list of possible display modes. } // GetPath is called again without using the cache. return(null); } else { return(nameRepresentsPath ? GetPathFromSpecificName(controllerContext, name, cacheKey, ref searchedLocations) : GetPathFromGeneralName(controllerContext, viewLocations, name, controllerName, areaName, cacheKey, ref searchedLocations)); } }
internal static VirtualPathData GetVirtualPathForArea( this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values, out bool usingAreas ) { if (routes == null) { throw new ArgumentNullException("routes"); } if (!String.IsNullOrEmpty(name)) { // the route name is a stronger qualifier than the area name, so just pipe it through usingAreas = false; return(routes.GetVirtualPath(requestContext, name, values)); } string targetArea = null; if (values != null) { object targetAreaRawValue; if (values.TryGetValue("area", out targetAreaRawValue)) { targetArea = targetAreaRawValue as string; } else { // set target area to current area if (requestContext != null) { targetArea = AreaHelpers.GetAreaName(requestContext.RouteData); } } } // need to apply a correction to the RVD if areas are in use RouteValueDictionary correctedValues = values; RouteCollection filteredRoutes = FilterRouteCollectionByArea( routes, targetArea, out usingAreas ); if (usingAreas) { correctedValues = new RouteValueDictionary(values); correctedValues.Remove("area"); } VirtualPathData vpd = filteredRoutes.GetVirtualPath(requestContext, correctedValues); return(vpd); }