在我的ASP.net Web项目中,我在.js文件中编写了以下Javascript代码:
function getDeviceTypes() { var deviceTypes; $.ajax({ async: false, type: "POST", url: "Controls/ModelSelectorWebMethods.aspx/getDeviceTypes", data: '{ }', contentType: "application/json;", dataType: "json", success: function(response) { deviceTypes = response.d; }, error: function(xhr, status) { debugger; alert('Error getting device types.'); } }); // end - $.ajax return deviceTypes; }
直到我尝试将此.js文件加载到子目录中的页面中,效果一直很好。
假设我的项目名称为widget。
widget
当我在主虚拟目录中使用此代码时,Javascript解释Controls/ModelSelectorWebMethods.aspx/getDeviceTypes为意思https://mysite.com/widget/Controls/ModelSelectorWebMethods.aspx/getDeviceTypes,一切都很好。但是,在子目录中的页面上,Javascript将其解释为意思https://mysite.com/widget/subdirectory/Controls/ModelSelectorWebMethods.aspx/getDeviceTypes,因此它不起作用。
Controls/ModelSelectorWebMethods.aspx/getDeviceTypes
https://mysite.com/widget/Controls/ModelSelectorWebMethods.aspx/getDeviceTypes
https://mysite.com/widget/subdirectory/Controls/ModelSelectorWebMethods.aspx/getDeviceTypes
如何编写Javascript代码,以便可以从应用程序中任何目录的页面调用AJAX Web方法?
您有两种选择:
var config = { base: <% /* however the hell you output stuff in ASPX */ %>, someOtherPref: 4
};
然后在AJAX url前面加上前缀config.base(并更改config.base是否在开发/测试/部署服务器上的值。)
config.base
<base />
就个人而言,我会选择选项1。您很可能会在其他位置找到该配置对象。
显然,配置对象必须包含在您的评估服务器端代码的站点的一部分中。一个.js没有自己的服务器配置文件将不会削减它。我总是在HTML中包含config对象<head>;它是一个小的配置对象,其内容可以在每个页面上更改,因此最好将其粘贴在其中。
.js
<head>