我有以下情况。
我开发了我的第一个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倍。
我确信我遗漏了一些基本的东西来简化这个。
由于
答案 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
填写您的详细信息,并设置与在“ 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
的内容。我试图使下面的示例尽可能简单。