打开相对URL以两个控制器为前缀

时间:2014-10-13 09:06:00

标签: javascript jquery asp.net-mvc model-view-controller

我有一个剃刀(.cshtml)文件的链接,我通过onClick事件调用一些jQuery:

...onclick="xxxx.forminstance.showFormInstanceNewTab(id);"....

jQuery:

xxxx.forminstance.showFormInstanceNewTab = function (id) {
var url = 'FormInstance/ViewForm/' + id;
window.open(url, '_blank')    }

然后上面应该打开网址https://localhost/xxxx/FormInstance/ViewForm/'id'

但是它在FormInstance之前添加了一个额外的Controller,因此URL最终为:

https://localhost/xxxx/FormPackage/FormInstance/ViewForm/'id'

然后导致错误。为什么要添加FormPackage?这将被定义/控制在哪里?我无法提供绝对URL,因为主机会在不同情况下发生变化。

1 个答案:

答案 0 :(得分:1)

您的问题是相对网址(不是绝对网页或相对根网址)将相对于当前网页,因此浏览器会自动将该部分网址预先添加到任何相关链接。

ASP / MVC / Razor中的一个常见问题是需要jQuery代码中的站点相对URL。 Web应用程序可能不会在域根目录下托管,因此您不能只使用 root-relative 路径(即以/开头)。

有几种技术,但我最喜欢的是将网站根目录注入页面的body元素:

e.g。用Razor语法

<body data-root="@Url.Content("~/")">

将转换为:

<body data-root="http://localhost:1234/">

或(如果您的网站作为应用程序托管):

<body data-root="http://localhost:1234/applicationroot">

所以你可以使用

从jQuery中选择它
 var root = $('body').data('root');

然后将该根URL添加到任何相对URL

e.g。在你的代码中:

var url = root + 'FormInstance/ViewForm/' + id;

我通常会在var root之后添加一个测试,以确保我的根网址始终有一个尾随/