17

我使用 JavaScript 代码来调用 MVC Web API。当前路径为:

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 位于一个独立文件中,不能使用 ASP.NET 语句,如Url.Content. 有更好的方法吗?

我找到了以下方法。有没有更好的解决方案:

1) 将以下代码写入 .cshtml 文件

<script type="text/javascript"> 
    var currentDomain = '@Url.Content("~")';
</script>

currentDomain2)从 .js 文件中读取变量:

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

4 回答 4

16

If you're trying to get link to an action, you can define JavaScript variales in your view that will be populated with Url.Action:

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

And later use this variable in your JS file:

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

If you want a general path to your app, you can do something like that:

<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>

And later use this variable somewhere in your JS files. Of course you don't have to use string.Format to do this, that's just an example.

EDIT:

You may also consider using RazorJS.

于 2013-04-27T09:47:52.047 回答
5
@Url.Action

对于 Javascript

@Url.Content

用于 CSS 和 JS 文件添加。

于 2013-04-27T09:03:55.207 回答
2

你试过URL helper吗?它允许您为您的控制器/操作生成一个完全限定的 URL,如下所示:

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

参考:MSDN

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

于 2013-04-27T09:00:05.297 回答
0

在视图集页面 URL 中:

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

}

于 2016-11-01T06:16:37.367 回答