2013-04-27 41 views
12

我使用JavaScript代码来调用MVC Web API。它正常工作时的电流路径是:javascript中的MVC“〜”路径

http://localhost/myApp/Administrator

但是当电流路径是失败:

http://localhost/myApp/Administrator/

我得到的错误The resource cannot be found。下面是代码:

$.getJSON("api/UserApi", 
    function (data) { 
     ...    
    }); 

我不想在代码中使用绝对URL,例如:

$.getJSON("http://localhost/myApp/api/UserApi",   
    function (data) { 
     ...  
    }); 

绝对URL不正常工作,但缺乏灵活性。有没有办法做同样的事情?

$.getJSON("~/api/UserApi",   
    function (data) { 
     ... 
    }); 

ASP.NET支持更换与当前应用程序的根路径中的 “〜” 字符,例如:

http://localhost/myApp

然而, “〜” 字符不是在JavaScript文件支持。我如何完成同样的事情?

JavaScript是独立文件,不能使用像Url.Content这样的ASP.NET语句。有没有更好的方法来做到这一点?

我发现了以下方法。是否有更好的解决方案?:

1)写下面的代码在.cshtml文件

2)阅读从.js文件的currentDomain变量:

$.getJSON(currentDomain + "/api/UserApi",   
    function (data) { 
     ...   
}); 

回答

13

如果你正在试图获得链接到一个动作,你可以定义的JavaScript variales在您看来,将与Url.Action填充:

<script type="text/javascript"> 
    var userApiPath = '@(Url.Action("userApi", "api"))'; 
</script> 

在你随后的JS文件中使用这个变量:

$.getJSON(userApiPath,   
    function (data) { 
}); 

如果你想你的应用程序的一般路径,你可以做这样的事情:

<script type="text/javascript"> 
    var path = '@(string.Format("{0}://{1}{2}", 
       Request.Url.Scheme, 
       Request.Url.Host, 
       (Request.Url.IsDefaultPort) ? "" : string.Format(":{0}", 
       Request.Url.Port)))'; 
</script> 

然后在你的JS文件的某个地方使用这个变量。当然,你不必使用string.Format来做到这一点,这只是一个例子。

编辑:

您也可以考虑使用RazorJS

+0

链接到razorjs不再工作 – Alok 2017-01-09 09:14:56

2

有你尝试了URL helper?它允许您为您的控制器/动作完全合格的URL,像这样的:

@Url.Action("Index", "Home", etc...) 

参考:MSDN

UPDATE
我注意到你指的写作动态网址到您的.js文件。您不应该将网址硬编码到您的脚本中,这会让您的代码难以维护。如果您明天更改域名并忘记更改其中一个脚本文件中的URL,该怎么办?您应该将URL作为参数传递给您的.cshtml页面中的JS函数。

+0

是的,我不想硬编码域名的。 js文件,所以我想找到一种像CSHTML文件中'〜'字符的方式,可以自动将'〜'字符替换为当前域,似乎没有办法在JS文件中执行它,所以我认为我有现在从CSHtml文件获取当前的域名,然后将其传递给js fi乐。 – sam 2013-04-27 09:16:31

2
@Url.Action 

对JavaScript的

@Url.Content 

的CSS和JS文件中添加。

+1

JavaScript是在一个独立的文件,不能使用asp.net语句,它有一个更好的方式来做到这一点? – sam 2013-04-27 09:09:18

0

在一个视图中设置网页网址:

<script type="text/javascript"> 
    var PageUrl = '@Url.Action("Index","Home")'; 
</script> 

然后在js文件:

function MyFunc() { 
var $form = $('form[id="Form"]'); 
    $.ajax({ 
    type: 'GET', 
    url: PageUrl+"/MyActionName", 
    data: $form.serialize(), 
    cache: false, 
    error: function (xhr, status, error) { 

    }, 
    success: function (result) { 
     //do something 
    } 
}); 

}