.net 在基于MVC3或MVC4的webwiste post中,如果我移动它,它将无法协同工作;子文件夹的虚拟位置

.net 在基于MVC3或MVC4的webwiste post中,如果我移动它,它将无法协同工作;子文件夹的虚拟位置,.net,asp.net-mvc-3,asp.net-mvc-4,.net,Asp.net Mvc 3,Asp.net Mvc 4,我已经开发了一个网站并在服务器上发布了它,在帖子中我有类似于/Home/GetResult的url,其中Home是控制器,GetResult是控制器上的操作方法 到目前为止,它运行良好,开发和部署没有问题 现在我想把整个网站移到一些子文件夹,并希望通过以下url访问它;现在在服务器端,移动到一个文件夹并将该文件夹映射到虚拟子文件夹就完成了 现在我的问题开始了,所有的帖子都在网站上无法完成他们的工作。然后我换了一个贴子试试 从Post URL:/Home/GetResult到/Version1/

我已经开发了一个网站并在服务器上发布了它,在帖子中我有类似于
/Home/GetResult
的url,其中
Home
是控制器,
GetResult
是控制器上的操作方法

到目前为止,它运行良好,开发和部署没有问题

现在我想把整个网站移到一些子文件夹,并希望通过以下url访问它;现在在服务器端,移动到一个文件夹并将该文件夹映射到虚拟子文件夹就完成了

现在我的问题开始了,所有的帖子都在网站上无法完成他们的工作。然后我换了一个贴子试试

从Post URL:
/Home/GetResult
/Version1/Home/GetResult

它开始工作了,但为什么会这样呢?如果这是唯一的方法,那么它意味着每次我们将其移动到某个次虚拟文件夹时,都需要更改post url

创建子虚拟目录之前的Java脚本:

$.ajax({
    type: 'POST',
    url: "/Home/GetResult",
    data: JSON.stringify(data),
    success: function (returnPayload) {
        if (returnPayload == "true") {
            // do job for success on UI.
        }
        else {
            // do job for Failuer on UI.
        }

    },
    error: function (xhr, ajaxOptions, thrownError) {
        // do job for Exception on UI.
    },
    dataType: "json",
    contentType: "application/json",
    processData: false,
    async: false
});
$.ajax({
    type: 'POST',
    url: "/Version1/Home/GetResult",

    data: JSON.stringify(data),
    success: function (returnPayload) {
        if (returnPayload == "true") {
            // do job for success on UI.
        }
        else {
            // do job for Failuer on UI.
        }

    },
    error: function (xhr, ajaxOptions, thrownError) {
        // do job for Exception on UI.
    },
    dataType: "json",
    contentType: "application/json",
    processData: false,
    async: false
});
创建子虚拟目录后的Java脚本:

$.ajax({
    type: 'POST',
    url: "/Home/GetResult",
    data: JSON.stringify(data),
    success: function (returnPayload) {
        if (returnPayload == "true") {
            // do job for success on UI.
        }
        else {
            // do job for Failuer on UI.
        }

    },
    error: function (xhr, ajaxOptions, thrownError) {
        // do job for Exception on UI.
    },
    dataType: "json",
    contentType: "application/json",
    processData: false,
    async: false
});
$.ajax({
    type: 'POST',
    url: "/Version1/Home/GetResult",

    data: JSON.stringify(data),
    success: function (returnPayload) {
        if (returnPayload == "true") {
            // do job for success on UI.
        }
        else {
            // do job for Failuer on UI.
        }

    },
    error: function (xhr, ajaxOptions, thrownError) {
        // do job for Exception on UI.
    },
    dataType: "json",
    contentType: "application/json",
    processData: false,
    async: false
});
上面是创建虚拟目录之前/之后包含post的简单代码段。
在上面的代码中,如果我不更改帖子url,我将无法发布。

硬编码的url会给您带来问题。请使用html帮助程序。例:

$.ajax({
    type: 'POST',
    url: '@Url.Action("GetResult", "Home")', // Will generate the proper url for you.
    data: JSON.stringify(data),
    success: function (returnPayload) {
    }
});
正如评论中所指出的,razor语法只有在脚本位于页面内时才有效,并且不能与外部javascript文件一起使用。如果您使用的是外部文件,那么我建议您将URL分配给外部脚本可以访问的变量。例:

index.cshtml

<script src="~/Scripts/MyAppScript.js"></script>
<script type="text/javascript">
    MyApp.GetResultUrl = '@Url.Action("GetResult", "Home")';
</script>

不是这样的,你能告诉我们呼叫代码吗?问题是你的代码。请始终借助html帮助程序为您生成url,例如
@url.Action
@html.ActionLink
,而不是硬编码。它将生成正确的url,而不管您的虚拟目录如何。只有当您的javascript在razor视图中时,它才有效。如果它是一个外部的.js文件,它将无法工作。作为对此的评论,如果你有一个单独的javascript库,你当然不能这样做。我们通常要做的是,我们将以类似“Init”的方法将一个变量传递到我们的库中,该方法使用@Url.Action表示路径。它通过使用@Url.Action(“GetResult”、“Home”)进行解析。是的,将JS保存在单独的文件中是一种很好的做法。我创建了它,并在文件顶部和单独的文件中声明了一个变量。