JQuery Post Call中的相对URL

时间:2013-08-20 14:44:49

标签: jquery asp.net-mvc url-routing

我有以下情况。

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

http://localhost:59441/

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

  $.ajax({
        type: "POST",
        url: "/CeduleGlobale/UpdateCheckBox", ...

CeduleGlobale是我的ControllerName 和 UpdateCheckBox是我的methodName

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

因此现在申请

http://testServer/JprApplication/

不再指定端口,还有应用程序名称

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

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

/JprMvc/CeduleGlobale/UpdateCheckBox
问题是2倍。

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

    由于

7 个答案:

答案 0 :(得分:45)

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

选项1 - 在视图内

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

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

选项2 - 独立JS文件

我们通常每页都有一个功能来设置该页面的处理程序。因此,我们可以执行以下操作:

视图

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

独立JS文件

function SetOrderPage(ajaxPostUrl){
       $.ajax({
           type: "POST",
           url: ajaxPostUrl
       )};
}

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

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

独立JS文件

var siteRoot;

视图

<script type="text/javascript">
    siteRoot = '@Request.ApplicationPath';
</script>

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

答案 1 :(得分:7)

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

$.ajax({
        type: "POST",
        url: "./CeduleGlobale/UpdateCheckBox", ...

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

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

$.ajax({
        type: "POST",
        url: serverRoot + "/CeduleGlobale/UpdateCheckBox", ...

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

答案 2 :(得分:2)

我在使用JQuery的MVC 5上遇到过这样的问题,所以当你在Localhost和任何Navigator中时,即使你在子文件夹中部署app,我也会使用这个解决问题的方法。< / p>

var pathname = window.location.pathname;
var VirtualDirectory;
if (pathname.indexOf("localhost") >= 0 && pathname.indexOf(":") >= 0) {
    VirtualDirectory = "";
}
else {
    if ((pathname.lastIndexOf('/')) === pathname.length + 1) {
        VirtualDirectory = pathname.substring(pathname.indexOf('/'), pathname.lastIndexOf('/'));
    } else {
        VirtualDirectory = pathname;
    }
}

然后在任何ajax调用中:

$.post(VirtualDirectory + "/Controller/Action", { data: data}, "html")
             .done(function (result) {
                 //some code             
});

答案 3 :(得分:1)

将@ Url.Action(“action”,“controller”)传递给视图中的javascript。这将允许它在运行时动态更新。

<script>
   myJavascriptfunction(@Url.Action("action","controller"),param1,param2);
</script>

可能还有一个函数来获取根路径,您可以使用它来初始化先前答案中的根变量。

答案 4 :(得分:1)

我知道这是一个老帖子。但是,我遇到了同样的问题并最终落到了这里。并设法使用UrlHelper.Action方法修复该问题。 应该使用这样的东西。 (请注意,此特定解决方案将在视图中起作用。)

url: "@Url.Action("UpdateCheckBox", "CeduleGlobale")",

希望这会有所帮助。 :)

答案 5 :(得分:0)

http://localhost:59441/
http://testServer/JprApplication/都可以与您

一起使用

$.ajax({ type: "POST", url: "/CeduleGlobale/UpdateCheckBox", ...

如果您在iis中托管,则只需在自己的主机中创建虚拟主机
C:\Windows\System32\drivers\etc\hosts

文件。 将此行添加到主机文件的底部

127.0.0.1 CeduleGlobale

create a new site like so 创建一个类似此选择站点的新站点,右键单击并创建一个新站点

fill in your details and set the same hostname as you created above 'CeduleGlobale'

填写您的详细信息,并设置与在“ CeduleGlobale”上方创建的主机名相同的主机名。

然后将您的mvc应用程序部署到此站点

答案 6 :(得分:0)

@Tommy的答案是一个很好的指针,但是对于 .NET Core ,我不得不做些不同的事情,因为Request对象具有不同的属性。

通过部署到虚拟目录但使用IIS Express进行开发使事情变得更加棘手。因此在设置基本网址时使用if语句。

Shared / _Layout.cshtml

<!-- Set the site root for javascript in _Layout.cshtml.-->
@if (!String.IsNullOrWhiteSpace(@Context.Request.PathBase.Value))
{
    /* LIVE - includes virtual directory */
    <script>
        window.siteRoot = "@Context.Request.Scheme" + "://" + "@Context.Request.Host.Value" + "@Context.Request.PathBase.Value" + "/";
    </script>
}
else
{
   /* DEBUG - no virutal directory, e.g. IIS Express */
    <script>
        window.siteRoot = "@Context.Request.Scheme" + "://" + "@Context.Request.Host.Value" + "/";
    </script>
}

然后从任何JavaScript文件

/* from any javascript file */
var url = window.siteRoot + 'MySearch/GetMySearchResults';

$.ajax({
    url: url,
    type: 'GET',
    cache: false,
    data: searchObj,
    success: function (result) {
        alert('yatta!');
    },
    fail: function (e, k, n) {
        alert('hmph!');
    },
    done: function() {
        // hide spinner
    }
});

显然,您可能希望创建自己的名称空间或保存polluting window的内容。我试图使下面的示例尽可能简单。