MVC控制器路径在VS VS生产上与ajax调用不一样

本文关键字:VS ajax 调用 不一样 生产上 路径 MVC 控制器 | 更新日期: 2023-09-27 18:02:53

在javascript中,当我点击一个链接时,我做一个ajax调用:

/过程/添加

在Visual Studio中运行时效果很好。当我发布到服务器时,我得到一个javascript错误,说它找不到:

http://servernamehere/Process/Add/

应该在

中查找
http://servernamehere/MyApp/Process/Add/

为什么在VS中它知道包含MyApp到路径,但在服务器上它没有?

function addRecord() {
            var name = $("#name").val();
            $.ajax({
                url: "/Process/Add/",
                type: "post",
                data: { firstname: name },
                success: function(data){
                    location.reload();
                }
            });
            return false;
        }

MVC控制器路径在VS VS生产上与ajax调用不一样

你必须在Javascript代码中呈现URL,所以它包含app root:

url: '@Url.Action("Add", "Process")'

如果不查看一些代码,就很难回答这个问题。但是,这通常是因为在本地运行时,您的站点被视为顶级站点,这意味着它不在"默认站点/[MY_SITE]"下。所以你的路径很好。

当你发布到服务器,然而,你的javascript代码不知道它不是/可能不是一个顶级网站。

我们内部有这个问题,我们在javascript中采用了以下模式。我们有一个init例程到我们的javascript库。

<script type="text/javascript">
    $(document).ready(function () {
        var apiPath = "@HttpContext.Current.Request.ApplicationPath";
        MyLibrary.Init(apiPath);
    });
</script>

然后在init方法中,我们根据需要附加了路径。所以int我们的init方法:

var apiParticipantPath = "/PATH/TO/REST/ENDPOINT";
var init = function(appRoot) {
if (appRoot !== "/") {
    apiParticipantPath = appRoot + apiParticipantPath;
}

,然后最后在使用

$.ajax({
    type: "DELETE",
    url: apiParticipantPath,
    data: {
        --STUFF
    },
    dataType: "text"
})
.done(function() {
    --STUFF
})
.fail(function() {
    --STUFF
})
.always(function() {});

如果您使用这样的模式,那么无论您使用的是顶级站点还是DEFAULT_SITE下面的虚拟目录都无关紧要。这也很好,因为你可以保持你的javascript库分开,而不必嵌入到你的视图来获取@Url。

我猜这就是你的问题所在。如果没有,请告诉我,我们可以进一步研究。