30

我有以下情况。

我开发了我的第一个 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 中硬编码虚拟目录名称,因为我不知道应用程序在生产环境中的名称,因此我必须修改我的脚本才能在生产环境中安装应用程序。

我确信我缺少一些基本的东西来简化这一点。

谢谢

4

7 回答 7

51

根据您实际将 JavaScript 放在哪里(在视图或单独的 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 文件中可能有一个全局变量,即站点根目录。这里的缺点是您需要手动创建每个操作方法路径。在每个页面上,您可以这样设置站点根全局变量:

独立的 JS 文件

var siteRoot;

看法

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

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

于 2013-08-20T15:02:07.803 回答
7

据我所知,没有其他方法可以解决这个问题。除非您愿意使用相对 URL,即:

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

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

IE

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

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

这样,如果你不需要它,你可以设置它serverRoot = '';,一切都会回到现在的状态。

于 2013-08-20T14:50:15.093 回答
2

我在使用 JQuery 的 MVC 5 上遇到了这种问题,所以我使用了这个解决方案,当您在 Localhost 和任何 Navigator 中时,即使您在子文件夹中部署应用程序也能解决这个问题。

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             
});
于 2017-04-19T07:09:23.983 回答
1

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

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

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

于 2013-08-20T15:01:21.893 回答
1

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

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

希望这可以帮助。:)

于 2014-09-17T10:31:55.153 回答
1

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

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

共享/_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
    }
});

显然,您可能希望创建自己的名称空间或其他东西来节省污染 window。我试图使下面的示例尽可能简单。

于 2018-12-18T16:39:30.117 回答
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

像这样创建一个新网站 像这样创建一个新站点选择站点,右键单击并创建一个新站点

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

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

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

于 2018-07-15T11:43:55.410 回答