我在javascript中没有硬编码时调整路径有些困难。我正在运行一个asp.net MVC3 Web应用程序。
如果我的路径是
形式 var url = 'http://serverNameHardcode/websiteNameHardcode/service/service?param1=' + param;
当我这样做时,事情正常。
$.get(url,
{},
function (data) {alert('callback success');},'json');
我想创建一个相对路径。我试过了
var url = 'service/service?param1=' + param;
当我在本地运行以及在Firefox中运行时,这是有效的,但在IE7中则不行。当我在没有硬编码的情况下发布到服务器时,回调永远不会触发。我知道MVC-3增加了路由的复杂性,但我不知道它是否适用于这种情况;所以,我标记了这个问题。
我应该如何设置路径以便不需要硬编码?
答案 0 :(得分:6)
只需从主视图中将应用程序路径写为全局js变量,然后将链接组成为
APPPATH + "path/whatever"
答案 1 :(得分:3)
只需要为我的一个jQuery插件解决这个问题,最好不要修改任何全局内容(即插件使用范围之外),所以我不得不忽略标记的答案。
我还发现,因为我在IIS中本地托管DEV,所以我无法使用根相对路径(因为localhost
不是根)。
我提出的解决方案扩展了我已经开始的内容:data-controller
属性,指定在我应用插件的元素中使用哪个控制器。我发现最好是对控制器名称进行数据驱动,以便更容易重用组件。
<div data-controller="Section">
<div data-controller="@Url.Content("~/Section")">
这会在控制器名称之前注入服务器根目录(例如/Test.WindowsAzure.Apr2014/
,所以我最终得到/Test.WindowsAzure.Apr2014/Section
,这对于然后附加actions
和其他参数是完美的。它还避免了在输出中有一个绝对路径(没有充分理由占用额外的字节)。
// Assuming $element points to the element your plugin/code is attached to...
var baseUrl = $element.data('controller');
var url = baseUrl + '/service?param1=' + param;
我们现在使用的另一种方法,当我们不介意注入全局值时,Razor将一个全局JavaScript变量注入布局文件中的window
:
<script>
window.SiteRoot = "@Url.Content("~/")";
</script>
并将其与
一起使用var url = window.SiteRoot + '/service?param1=' + param;
答案 2 :(得分:2)
一个选项:
var editLink = '@Url.Action("_EditActivity", "Home")';
$('#activities').load(editLink + "?activityID=" + id);
另一个例子:
var actionURL = '@Url.Action("_DeleteActivity", "Home")';
$('#activities').load(actionURL + "?goalID=" + gID + "&activityID=" + aID);
如果您不需要添加到字符串:
$('#activities').load('@Url.Action("_Activities", "Home", new { goalID = Model.goalID},null)');
答案 3 :(得分:2)
我真的需要让它运行的路径,也许是它的IE7。谁知道。但这对我有用。
抓取网址并将其存储在某处。我选择从HTML5实现数据属性。
<div id="websitePath" data-websitePath='@Request.Url.GetLeftPart(System.UriPartial.Authority)@Request.ApplicationPath'></div>
然后,当您需要执行某些AJAX或以其他方式在javascript中使用URL时,您只需引用存储的值即可。此外,IIS的版本也有所不同(如果你的devbox是IIS5而你的服务器是IIS7,那就太酷了)。 @Request.ApplicationPath
可能会或可能不会返回'/'
附加到最后。因此,作为一种解决方法,如果它是/
,我还会修剪最后一个字符。然后将/
作为网址的一部分加入。
var urlprefix = $('#websitePath').data('websitepath');
urlprefix = urlprefix.replace(/\/$/, "");
var url = urlprefix + '/service/service?param1=' + param;
答案 4 :(得分:-1)
虽然接受的答案是正确的,但我想添加一个建议(即我是怎么做的)。
我正在使用MVC,并且任何ajax请求都会转到控制器。我的控制器有服务,所以如果需要服务呼叫,控制器将采取这种服务。
那么我的意思是什么?因此,如果ajax总是与控制器通信,那么我想让MVC路由为我解析路径。所以我在Javascript中为url写的是这样的:
url: 'controller/action'
这种方式不需要根路径等......
此外,您可以将其放在单独的Javascript文件中,它也可以使用,而@ Url.Content则需要在视图上调用。