Пока вы не заботитесь о asp.net виртуальных каталогах (что фактически делает невозможным определение из скрипта, вам придется что-то передавать с сервера), вы можете посмотреть на URL и разобрать его:
function baseUrl() {
var href = window.location.href.split('/');
return href[0]+'//'+href[2]+'/';
}
, то:
...
url: baseUrl()+"Controls/ModelSelectorWebMethods.aspx/getDeviceTypes",
...
... и теперь я вижу из ваших комментариев выше, что виртуальные каталоги являются проблемой. Я обычно делаю это.
1) На вашей главной странице поместите код, чтобы внедрить скрипт куда-нибудь, желательно, прежде чем что-либо еще (я добавляю его непосредственно в HEAD, добавляя элементы управления вместо использования ScriptManager), чтобы убедиться, что он выполняется перед любым другим скриптом. c #:
string basePath = Request.ApplicationPath;
// Annoyingly, Request.ApplicationPath is inconsistent about trailing slash
// (if not root path, then there is no trailing slash) so add one to ensure
// consistency if needed
string myLocation = "basePath='" + basePath + basePath=="/"?"":"/" + "';";
// now emit myLocation as script however you want, ideally in head
2) Измените baseUrl, чтобы включить это:
function baseUrl() {
var href = window.location.href.split('/');
return href[0]+'//'+href[2]+basePath;
}