发布

时间:2017-04-27 13:33:28

标签: ajax asp.net-mvc asp.net-web-api

我在我的应用程序中使用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 }
);

3 个答案:

答案 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,而无需在环境之间进行更改。能够通过名称引用它们使得很容易找到合适的。

另外一件事,如果你不知道FromUriFromBody属性,告诉你的方法动作参数的来源。

当然,如果你要在生产代码中使用它,你应该设置一个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")

希望这有帮助。