JQuery Post Call中的相对URL

Ser*_*Now 25 asp.net-mvc jquery url-routing

我有以下情况.

我开发了我的第一个MVC Asp.Net应用程序.它在我的服务器上运行以下地址

http://localhost:59441/
Run Code Online (Sandbox Code Playgroud)

我写了一些看起来像这样的JQuery Post Methods

  $.ajax({
        type: "POST",
        url: "/CeduleGlobale/UpdateCheckBox", ...
Run Code Online (Sandbox Code Playgroud)

CeduleGlobale是我的ControllerName,UpdateCheckBox是我的methodName

当我将应用程序放在testServer上时,它被放在VirtualDirectory中

因此现在申请

http://testServer/JprApplication/
Run Code Online (Sandbox Code Playgroud)

没有更多要指定的端口以及应用程序名称

当我开始测试时,我很快发现我的JQuery Post调用不再起作用了......

我修改了它们,所以现在URL是

/JprMvc/CeduleGlobale/UpdateCheckBox
Run Code Online (Sandbox Code Playgroud)

问题是2倍.

  1. 这使我很难在我的开发机器上进行测试,因为IIS Express不允许我指定虚拟目录.
  2. 我不喜欢在JQuery中硬编码虚拟目录名称,因为我不知道应用程序在生产环境中将具有什么名称,因此我必须先修改我的脚本才能在生产环境中安装应用程序.

我确信我遗漏了一些基本的东西来简化这个.

谢谢

Tom*_*mmy 47

根据您实际拥有JavaScript的位置(在View或单独的JS文件中),您有几个选项.

选项1 - 在视图内

只需使用Html Helpers为您生成链接

<script type="text/javascript">
   $(function(){
        $.ajax({
           type: "POST",
           url: "@Url.Action("UpdateCheckBox", "CeduleGlobale")"
        });
   });
</script>
Run Code Online (Sandbox Code Playgroud)

选项2 - 独立JS文件

我们通常每页都有一个功能来设置该页面的处理程序.所以,我们可以做以下事情:

视图

<script type="text/javascript">
    $(function(){
        SetOrderPage('@Url.Action("UpdateCheckBox", "CeduleGlobale")');
    });
</script>
Run Code Online (Sandbox Code Playgroud)

独立的JS文件

function SetOrderPage(ajaxPostUrl){
       $.ajax({
           type: "POST",
           url: ajaxPostUrl
       )};
}
Run Code Online (Sandbox Code Playgroud)

选项3 - 独立JS文件方法2

你可以在你的JS文件中有一个全局变量,它是siteroot.这里的缺点是您需要手动创建每个操作方法路径.在每个页面上,您可以设置站点根全局变量:

独立的JS文件

var siteRoot;
Run Code Online (Sandbox Code Playgroud)

视图

<script type="text/javascript">
    siteRoot = '@Request.ApplicationPath';
</script>
Run Code Online (Sandbox Code Playgroud)

请记住,您不能在独立的JS文件中使用Razor语法.我认为最好让Razor/MVC/.NET动态地为您提供站点路径或URL路由,因为它将真正减少在站点/虚拟目录之间移动时可能出现的错误.


Rob*_*ker 7

据我所知,除此之外别无他法.除非您愿意使用相对URL,即:

$.ajax({
        type: "POST",
        url: "./CeduleGlobale/UpdateCheckBox", ...
Run Code Online (Sandbox Code Playgroud)

但是,当您重构代码时,由于各种原因,这可能会变得混乱.或者在前面添加全局定义的URL,因此您只需要在进入生产之前将其更改为一次.

//Globally defined serverRoot
serverRoot = "http://someaddress/somevirtualdirectory";

$.ajax({
        type: "POST",
        url: serverRoot + "/CeduleGlobale/UpdateCheckBox", ...
Run Code Online (Sandbox Code Playgroud)

这样,如果你不需要它,你可以设置serverRoot = '';,所有将回到它现在的状态.