ASP.NET MVC中解决JavaScript中的URL问题

17

我正在使用jQuery.load('/Business/Tags')加载一些内容,当使用本地Web服务器时,它可以正常工作。但是在使用IIS时,这个URL无法正确解析。我看到了一些不同的方法来解决这个问题,比如使用ResolveUrl。那么,在JavaScript中处理解析URL的最佳方式是什么?

4个回答

19

我也曾遇到过类似的问题,我的情况与JavaScript有关。由于我的JavaScript也在一个单独的文件中,并且包含在我的主页面中,因此我无法在我的情况下使用ResolveUrl。

以下是我在这种情况下解决问题的方法。我在我的主页面的头部标签中添加了以下JavaScript:

<script type="text/javascript">
    var baseUrl = "<%= Request.Url.GetLeftPart(UriPartial.Authority) %>";
</script>
我正在设置一个全局变量,可以在所有JavaScript文件中访问,名称为baseUrl。
你的代码将变成这样:
jQuery.load(baseUrl + '/Business/Tags');

我尝试了这种方法,但是我没有得到我需要的东西,但我认为我可以处理它。我得到了一个像这样的字符串“http://mtsengv003/”,但我需要一个像这样的字符串“http://mtsengv003/MVC/”。谢谢。 - Chris
5
我认为最好使用以下代码: var baseUrl = "<%= Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath.TrimEnd('/') %>"; 这行代码可以获取网站的基本URL地址。 - eu-ge-ne
@eu-ge-ne:感谢您指出这一点。我的记忆力已经不如以前了。您的代码是完美的。 - Praveen Angyan

5

就我而言,我在可能的情况下使用Url.Action / Url.RouteUrl助手与JavaScript / jQuery:

$.load('<%= Url.Action("Tags", "Business") %>')

或者

$.load('<%= Url.RouteUrl("BusinessTagsRoute") %>')

在其他情况下,我使用ResolveUrl助手(来自MVCContrib或您可以编写自己的):
$.load('<%= Url.ResolveUrl("~/Business/Tags") %>')

更新:

您还可以为JavaScript / jQuery创建特殊控制器,其中包含操作,返回带有JavaScript的PartialView:

public ActionResult YourJavaScript()
{
    Response.ContentType = "application/x-javascript";
    return PartialView("YourJavaScript");
}

然后在YourJavaScript.ascx文件中,您可以使用带有WebForms服务器标记的JavaScript/jQuery代码。我仍然建议不要在jQuery/AJAX中使用硬编码的URL。


1
如果您将所有JavaScript代码放在单独的文件中,然后在主页面中使用Url.Content引用该文件,则Url.ResolveUrl将无法在JavaScript中工作。如果我对此有误,请有人纠正我。 - Praveen Angyan

2
我们在应用程序中实现此目标的几种方法:

一些我们在应用程序中采取的方式:

 var applicationPath = '<%= Url.Content("~/") %>';

或者

 var applicationPath = '<%= Request.Url.Scheme %>://<%= Request.Url.Host %><%= Request.ApplicationPath %>/';

我们随后将使用applicationPath作为所有ajax调用的基本url。

1

我仍然建议在您的主页中使用基本 href 标签。因此,任何图像或 JavaScript 调用都将从此 URL 解析。这将允许您将 JavaScript 函数/调用放置在外部 js 文件中。

<html>
    <head>
        <base href="http://www.mysite.com/virtual_dir1/">
        <script src="location_of_js_file">

请记住基本 href 中的结尾 '/ '。

另外,请删除前导 '/',每当您执行 jQuery.load('Business/Tags') 时,它实际上将来自http://www.mysite.com/virtual_dir1/Business/Tags


我非常非常喜欢这种方法。非常简洁,需要很少的努力。谢谢。 - lomaxx
这绝对是解决问题的务实方法,但是以这种方式使用base是不正确的。Base HREF只应用于将相对URI解析为当前所在页面。通过这种方式设置base所有此页面上的相对URI都将指向http://www.mysite.com/virtual_dir1/ - ahsteele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接