我在我的应用程序中使用WEB API控制器,我使用ajax来调用该控制器方法。
网址是:
url: "/api/Informations/" + link.attr("data-id")
这在我的本地机器上完美运行。
问题出在我发布的时候。
我必须将网址更改为:
url: "ProjectNameOnServer/api/Informations/" + link.attr("data-id")
有解决方法吗?因为如果有这个问题,我将不得不不断更改网址以在我的本地计算机上测试它..然后当问题得到解决时...将其更改回其在服务器上工作的版本。
有关于此的任何想法吗?
更新
api的路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
答案 0 :(得分:3)
我不使用config.Routes.MapHttpRoute()
配置,而是使用属性路由。不幸的是,进行此更改可能非常耗时,但它应该可以解决您的问题。 (作为测试,您可以使用属性设置单个操作,看看它是否有效。)
第1步将config.Routes.MapHttpRoute()
方法中的WebApiConfig.Register
替换为:
config.MapHttpAttributeRoutes();
第2步使用以下属性装饰InformationController
:
[RoutePrefix("api/information")]
public class InformationController: ApiController { ... }
第3步使用以下属性装饰您的操作:
[HttpPost, Route("{id:int}", Name = "InformationSingleGet"]
public Information Get([FromBody] int id) { ... }
第4步使用Razor UrlHelper.RouteUrl方法将您的路线传递到JavaScript中:
var infoGetUrl = '@Url.RouteUrl("InformationSingleGet")';
使用RouteUrl
方法的好处是它可以为您构建URL,而无需在环境之间进行更改。能够通过名称引用它们使得很容易找到合适的。
另外一件事,如果你不知道FromUri
和FromBody
属性,告诉你的方法动作参数的来源。
当然,如果你要在生产代码中使用它,你应该设置一个Constants类,你可以在一个地方设置这些路径名,并通过引用属性来设置它们。你也不应该把变量扔进JavaScript窗口对象,但这是一个不同的讨论。
<强>更新强>
如果您正在使用这样的路由引擎,对于URL的任何POST或其他动态尾随部分,您应该使用查询字符串参数而不是URL的直接部分。
当您致电Url.RouteUrl
时,会发生什么事情,它会在此时构建整个网址。因此,您需要知道创建URL时URL的一部分是什么动态值。如果它位于此页面(api/information/1/details
),这将是很好的,但如果您从列表中选择一个,那么您就不会提前知道。因此,查询字符串参数或Body是可行的方法。
为了使用动态参数设置一个,你可以设置如下:
[Route("{id:int}/details", Name = "InformationDetails")]
然后在您的页面中创建它:
var detailsUrl = '@Url.RouteUrl("InformationDetails", {id = model.Id})';
答案 1 :(得分:1)
在母版页或母版页中包含的JavaScript文件中,创建一个变量并在其中设置基本URL。并且对于所有ajax操作,在URL之前附加此变量。
因此,如果您在UI中使用MVC,则可以在_layouts.cshtml中执行以下操作。
<script>
var settings = {};
settings.baseUri = '@Request.ApplicationPath';
</script>
在您的ajax调用中,您可以将其更改为:
url: settings.baseUri + "/api/Informations/" + link.attr("data-id")
答案 2 :(得分:0)
我在我的js文件中使用以下函数来访问api:
var isAppFolder = true;//true: when deployed & false: when running locally
function rootUrl() {
if (!window.location.origin) {
window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : '');
}
var url = window.location.origin + "/";
if (isAppFolder != true)
return url;
var url = url + location.pathname.split('/')[1] + '/';
if (isAppFolder == true)
return url;
var url = url + location.pathname.split('/')[2] + '/';
return url;
}
并像这样访问网址:
url: rootUrl() +"api/Informations/" + link.attr("data-id")
希望这有帮助。