Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何使用MVC3在javascript中创建相对路径?_Javascript_Jquery_Ajax_Asp.net Mvc 3 - Fatal编程技术网

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

我应该如何使用MVC3在javascript中创建相对路径?,javascript,jquery,ajax,asp.net-mvc-3,Javascript,Jquery,Ajax,Asp.net Mvc 3,如果没有javascript中的硬代码,我很难对齐路径。我正在运行一个asp.net MVC3 web应用程序 如果我的路径是 var url='1〕http://serverNameHardcode/websiteNameHardcode/service/service?param1=“+param 当我这么做的时候,一切都很顺利 $.get(url, {}, function (data) {alert('callback success');},'json

如果没有javascript中的硬代码,我很难对齐路径。我正在运行一个asp.net MVC3 web应用程序

如果我的路径是

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

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

一个选项:

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)');

我真的需要一条路让它工作,也许是IE7。谁知道呢。但这对我很有效

抓取URL并将其存储在某个位置。我选择实现HTML5中的数据属性

<div id="websitePath" data-websitePath='@Request.Url.GetLeftPart(System.UriPartial.Authority)@Request.ApplicationPath'></div>

只需将应用程序路径作为全局js变量从主视图中写出,然后按如下方式组合链接

APPPATH + "path/whatever"

虽然被接受的答案是正确的,但我想补充一点建议(即我如何做)

我使用的是MVC,任何ajax请求都会发送到控制器。我的控制器有服务,因此如果需要服务调用,控制器将接管该服务

那么我的观点是什么?因此,如果ajax总是与控制器通信,那么我希望让MVC路由为我解析路径。因此,我在Javascript中为url编写的内容如下:

url: 'controller/action'
这样就不需要根路径等


另外,你可以把它放在一个单独的Javascript文件中,它也可以工作,而@Url.Content需要在视图中被调用。

只是为了解决我的一个jQuery插件的问题,最好不要修改任何全局性的东西(即,在插件使用范围之外),所以我不得不忽略标记的答案

我还发现,由于我在IIS中本地托管DEV,因此无法使用根相对路径(因为
localhost
不是根)

我提出的解决方案扩展了我已经开始使用的内容:一个
数据控制器
属性,指定在我应用插件的元素中使用哪个控制器。我发现最好是数据驱动控制器名称,这样组件就可以更容易地重用

以前的: 更新: 当我们不介意注入全局值时,我们现在使用的另一种方法是将单个全局JavaScript变量注入布局文件中的
窗口

<script>
   window.SiteRoot = "@Url.Content("~/")";
</script>

您确定这是url问题,而不是脚本错误吗?这个路径在我看来很好,应该与AFAIK的所有主流浏览器兼容。@mellamokb-我所知道的是,硬编码的路径是有效的。没有硬代码的路径不可用。当我在本地运行时,不需要硬编码。我的猜测是MVC-3让事情变得异常复杂。给我们一些关于你点击的url的更多信息。它是什么,它在哪个项目中,谁拥有它,它是指向控制器的路径还是指向wcf服务端点的固定路径,等等。启动firebug或chromes js控制台,查看XHR中的错误url。这会给你一个提示,告诉你是什么搞砸了它up@Allen-它们是控制器。我使用控制器作为服务。我需要指向网站根目录“~/”的URL,或者可能是整个URL的第一部分
http://mysite/mysubdomain
。实际上,可能是后者。只要知道服务路径,我就知道了我已经知道的(第二个url不起作用)。如果Javascript与Razor视图内联,这是有效的。如果你的JS在外部文件中(应该是这样),你还必须将它们定义为视图(使用匹配的控制器)。我不明白这与我在问题中发布的第二个URL有什么不同。我相信我需要找到服务器路径
http://server/subdomain
。这是可能的-我一直认为使用@Url.Action(代替硬编码路径)将自动处理根据结构创建正确路径的问题将其添加到共享布局的顶部
var-AppPath='@Url.Content(“~/”)“
然后像BNL上面所说的那样使用它。虽然这样做有效,但我发现添加全局设置会破坏插件可能具有的任何封装功能。我喜欢简单地插入东西,让它们在不修改母版页的情况下工作。我在下面建议了一种替代方法,我刚刚在一个生产项目中使用过,可以避免这些问题。这真是太棒了。我尝试了很多东西。但这是唯一worked@DotNetBeginner:我在下面建议了一个简单得多的替代方案,因为您不需要完整的URL(只需要根相对路径)。-1:此解决方案不起作用,因为链接是相对于当前页面的。仅供参考MVC
ActionLinks
始终插入根相对路径(包括“/和任何虚拟IIS文件夹)。如果只是将示例设置为根相对路径,那么如果将其托管在虚拟应用程序/文件夹中,它仍然无法工作。基本上是先尝试了一下,然后才意识到这根本不可能奏效。没想到我们在谈论ActionLink。我们讨论的是Javascript AJAX调用,
ActionLink
注释纯粹是为了指出MVC链接通常是根相关的。你的链接是相对页面的,不会工作(我知道,我尝试了所有选项)。我更喜欢这种方法,因为它不需要与任何主文件发生冲突。
   <div data-controller="Section">
   <div data-controller="@Url.Content("~/Section")">
// Assuming $element points to the element your plugin/code is attached to...
var baseUrl = $element.data('controller');
var url = baseUrl + '/service?param1=' + param;
<script>
   window.SiteRoot = "@Url.Content("~/")";
</script>
var url = window.SiteRoot + '/service?param1=' + param;