我应该如何使用MVC3在javascript中创建相对路径?

时间:2011-09-29 18:05:52

标签: javascript jquery ajax asp.net-mvc-3

我在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增加了路由的复杂性,但我不知道它是否适用于这种情况;所以,我标记了这个问题。

我应该如何设置路径以便不需要硬编码?

5 个答案:

答案 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则需要在视图上调用。