ThinkGeo.com    |     Documentation    |     Premium Support

Relative URLs for axd resource files when map is on MVC page defined as default route

We have an MVC single-page application where the map is located on the page defined by the default routing (Home/Index).  The *.axd resource files load fine when the "full" URL containing the controller and action is used (e.g., /localhost/applicationname/home/index), but when just the application root URL (/localhost/applicationname) is called, MVC correctly re-routes the request to HomeController.Index to load the page, but the resource files point to /localhost/, not /localhost/applicationname.  This causes 404 - Not Found results for the axd resources.



We can correct the behavior for the core js libraries by setting MapBuilder.IsDefaultJavascriptLibraryDisabled to true in the partial view containing the mapusing and using hard-coded script references in the page, such as:


<script type="text/javascript" id="opl" src="@Url.Content("~/opl_GeoResource.axd")">script>



However, other calls to axd files during map loading still have the incorrect URL. For example, tiles are loaded using:



localhost/tile_GeoResource.axd (URL is missing application name, which cases 404 - Not Found result)



How can we configure the map to use the correct URLs in this situation? In other words load the map using

localhost/applicationname



and have all resources use relative URLs like:



localhost/applicationname/<somemapresource>.axd 



Thanks





</somemapresource>


Hi Chuck, 
  
 I am sorry that make troubles. But set IsDefaultJavascriptLibraryDisabled to true and register all the axd maybe the only solution for now. 
  
 Here are six important JS files which you can find at client side: 
 • opl_GeoResource.axd?v=6.0.0.0 (OpenLayers.js) 
 • extension_GeoResource.axd?v=6.0.0.0 (OpenLayersExtension.js) 
 • helper_GeoResource.axd?v=6.0.0.0 (MapHelper.js) 
 • parser_GeoResource.axd?v=6.0.0.0 (MapParser.js) 
 • func_GeoResource.axd?v=6.0.0.0 (GeoFunction.js) 
 • cm_GeoResource.axd?v=6.0.0.0 (ContextMenu.js) 
  
 Regards, 
  
 Don

Hi Don,



Unfortunately your suggestion isn’t a working solution.  While it allows the js libraries to load correctly, the map still fails to load.  I suspect the problem lies in the “rootPath” definition in the map-initiation script below:


<script id=“initMapScript” type=“text/javascript”>
//[code]<![CDATA[</code>
var rootPath = ‘…/’;var jsoncMap1={“resolutions”: [remainder of json definition]};parsercMap1=new mapParser(jsoncMap1);Map1=parsercMap1.map;CreateAllMaps();keepsession(rootPath);var tg=new ThinkGeo(‘cMap1’);Class.Extent(Map1,tg);initMapSize(parsercMap1.map,rootPath,‘VBhbwuqE4kOdPhgpZOy0cQ_cMap1’);//]]>
</script>

Is there any way to programmatically alter the rootPath setting so the subsequent *.axd requests have the correct URL?




Hi Chuck, 
  
 Actually, In MvcEdition, all the resources, like .axd are redirected with a path refix paramter “rootPath” on client side, in other words, beside the workaround you have tried to change the regular .axd path, you still try the things as following to modify the image’s load path and tileResource.axd path: 
  
  
     OnMapCreating = function (map) { 
         OpenLayers.ImgPath = “path prefix your want” + IconPath; 
         rootPath = “path prefix your want”; 
     } 
  
 Please modify the “path prefix your want” to what you would like to change the final .axd request path. 
  
 Thanks, 
 Johnny

Thanks Johnny.  That gets me closer.  I’m able to get the tile images to display, but the following calls are still not recognizing the modified rootPath:



1. localhost/content/theme/default/style.css 

2. localhost/bg_GeoResource.axd 



The bg_Georesource.axd call is in the following style attribute for first table cell in table “cMap1Container”:



text-align:left;background-image:url(…/bg_GeoResource.axd?ClientID=cMap1&PageName=okDy1WQHMUq0oOvwdgTNw_cMap1

&Fresh=59295929&Format=image/png&Quality=100);margin:0px;height:100%;overflow:visible;



Notice that the url makes no reference to rootPath.



EDIT: map.ajaxCallAction() also appears to be affected by this issue.  It’s getting the root URL from mapParser.json.rootPath.




Hi Chuck,



Seems like there is a more convenient way here by overwriting the  protected property “PageRootPath” of the Map object. This property is really the “rootPath” which is used everywhere to redirect the URL, in other words, all these URLs are in Map Suite follow the URL structure like “rootPath” + “Real Request Path”, such as “…bg_GeoResource.axd?..” is created following “rootPath” + “bg_GeoResource.axd…”. Following is the code:




public class MyMap : Map
{
    public MyMap()
        : this(Guid.NewGuid().ToString())
    { }
 
    public MyMap(string name)
        : this(name, 640, 480)
    {
    }
 
    public MyMap(string name, Unit width, Unit height)
        : base(name, width, height)
    {
        // Todo: change the “PageRootPath” to what we want, it should be a virtual path, such as “…&#34;
        this.PageRootPath = @”…&#34;;
    }
}

NOTE: in the old 7.0 versions, the “PageRootPath” doesn’t have “Set” property, so please get the latest version 7.0.17.0 or later to have a try.





Thanks,

Johnny




That makes sense - I’ll give it a try.  When do you expect a version 7.0.17.0 or higher will be available for download?  Currently the daily development build is 6.0.353.0 (doesn’t seem right, was 7.0.16.0 earlier today) and daily production build is 7.0.0.16.

Hi Chuck, 
  
 Sorry for the inconvenience, we have fixed it, now 7.0.16.0 should be available now. 
 if you have any more question , please feel free to let us know. 
  
 Best Regards 
  
 Summer

Thanks. I downloaded 7.0.19.0 and was successfully able to pass an alternate root path url, but I have run into a different problem trying to use the “MyMap” approach above.  When using such an inheriting class, the map json is omitting the maxExtent values, which causes the initMap function in parser_GeoResource.axd to break on the following line because json.maxExtent is null:



options.maxExtent = new OpenLayers.Bounds(json.maxExtent.left, json.maxExtent.bottom, json.maxExtent.right, json.maxExtent.top);



The json created when rendering the MVC map view using the Map class is:

var jsoncMap1={

“resolutions”:[8202.0789042107263,…etc. …,160.2410043320491], 

“maxExtent”:{“left”:-1000000000,“bottom”:-1000000000,“right”:1001044786.10248,“top”:1001044786.10248},

“currentExtent”:{“left”:-14304554.5669357,“bottom”:2753408.10927947,“right”:-7291426.64695942,“top”:6621293.72257702},

“cursor”:“default”,

“units”:“Meter”,

etc.


In contrast, when using an inherited class like MyMap above (even if cast back to Map before passing to the view) is:



var jsoncMap1={

“resolutions”:[8202.0789042107263,…etc. …,160.2410043320491],

“currentExtent”:{“left”:-14304554.5669357,“bottom”:2753408.10927947,“right”:-7291426.64695942,“top”:6621293.72257702},

“cursor”:“default”,

“units”:“Meter”,

etc.



I haven’t tried to compare the entire json to see if anything else is missing.





Hi Chuck, 
  
 Thanks for reporting the problem and it is proved to be a bug in custom map. Now, we have fixed it, woudl you please get the latest 7.0.21.0 package and try it again. 
 Note: the 7.0.21.0 package is still in build and will be available in hours. 
  
 if you have any more question , please feel free to let us know. 
  
 Best Regards 
  
 Summer 


I had the same issue and I found that using the html base tag works very well when the application is not located at the root of the web server. 
  
 Just set the base with the full path to the web folder where the application is installed and no need to mess with route… 
  
 Works great. 
  
 Jm

Jean-marie, 
  
 Any share should be helpful for some guy. So thanks for your share! 
  
 Regards, 
  
 Don

Summer,



Sorry for the delayed reply - just getting back to this issue again.  The Daily Development Builds are showing the old MvcEditionFull6.0.353.0DllPackage.zip again.  Can you all correct that to the latest build so I can download it?



Thanks,



Chuck



Jean-marie - Thanks for the suggestion.  Did the html base tag work when the map page was accessed via both the application root () AND action-specific (\controller\action) URLs?  I originally tried that before starting this thread and recall that it worked with the root URL but broke with the \controller\action URL.

Hi chuck, 
  
 Yes, does work well all the time.  The map control is able to find the axd files without any issue whatever how deep the application folder is and from MVC.Net point of view I do not have any issue at all.  If I have enough time I shall post a simple application using the html base tag.  Just in case, the html base tag must be defined inside the html head. 
  
 jm

I forgot to tell you that I have an htmlhelper that is testing if I am in debug mode under VS or in release mode.  If in release mode then the HTML Base tag is set with the full path from the root of the web server to the application folder.  I do use Ajax a lot and I get the url from the HTML base tag as well. 
  
 jm.

Hi Chuck, 
  
 It looks the version is correct now, sometimes some version will rollback, but we will correct it ASAP at latest the next day. 
  
 Regards, 
  
 Don

Thanks Jean-marie.  I think our issue was we’re running a couple of maps within a singe-page application, and the SPA relies on ajax/js libraries that use relative references.  If we fix the map with the base tag, then we break something else. 

Thanks Don.  I pulled down build 7.0.38.0 and now using PageRootPath seems to be working well.

Hi Chuck, 
  
 I am glad to hear that works for you. 
  
 Regards, 
  
 Don

I’ve just downloaded the latest build (7.0.0.151) and it’s telling me that for the ‘MyMap’ class you have above, PageRootPath is a readonly property and can’t be assigned to.  Was this property removed in later versions?