11

我正在尝试在我的 js 文件中使用 Url.Action() 方法来为我的 ajax 调用定义 url。到目前为止,我失败了。

 $.ajax(
 {
    type: "POST",
    url: '@Url.Action("SomeAction", "SomeController")',
    data: { 
        fileID: rightClickedFileId
    },
    success: function (data) {

    }
 });

如果我以这种方式定义 url,浏览器会尝试将数据发布到

http://localhost:5907/FileManager/@Url.Action(%22SomeAction%22,%20%22SomeController%22)

结果我的ajax调用失败了。

但是,如果我'/SomeController/SomeAction'改用,一切正常。

第二个工作正常,但我想知道第一个的问题?可能是由于路由配置?

谢谢。

4

4 回答 4

21

Url.Action是一个 html 辅助方法,它可以在你的 razor 视图中工作,而不是在你的外部 javascript 文件中。

您可以做的是,Url.Action在剃刀视图中使用辅助方法获取操作方法的相对 URL,并将其设置为 javascript 变量并在外部 js 文件中使用它。执行此操作时,请始终确保使用 javascript 命名空间以避免与现有全局变量可能发生冲突。

您可以在_Layout.cshtml中添加此代码

<script type="text/javascript">

    var yourApp = yourApp || {};
    yourApp.Urls = yourApp.Urls || {};
    yourApp.Urls.baseUrl = '@Url.Content("~")';
    yourApp.Urls.editUserUrl= '@Url.Action("Edit","User")';

</script>

或者在您的页面特定视图中,

@section Scripts
{
  <script type="text/javascript">

     var yourApp = yourApp || {};
     yourApp.Urls = yourApp.Urls || {};
     yourApp.Urls.baseUrl = '@Url.Content("~")';
     yourApp.Urls.editUserUrl= '@Url.Action("Edit","User")';

  </script>
  <script src="~/Scripts/PageSpecificExternalJsFile.js"></script>    
}

现在在您的外部 javascript 文件中,您可以像访问它一样

var urlToEditUser = yourApp.Urls.editUserUrl;
//you can use urlToEditUser  now

// Or With the base url, you may safely add the remaining part of your url.
var urlToEditUser2 = yourApp.Urls.baseUrl+"User/Edit";
//you can use urlToEditUser2  now

始终使用Url.Actionor Url.RouteUrlhtml 辅助方法来构建操作方法的相对 url。无论您当前的页面/路径如何,它都会正确构建 url。

如果你想在你的角度控制器/数据服务等中做同样的事情,看看这篇文章,它解释了如何使用角度值提供者来做同样的事情。

于 2012-09-20T14:36:42.160 回答
7

您不能'@Url.Action("SomeAction", "SomeController")'在 js 文件中使用,因为这是 ASP.NET MVC 助手,如果您将代码放到视图中,一切都会正常工作。

于 2012-09-20T14:32:55.137 回答
1

我的方法与@Shyju 的方法类似,只是我没有在 Razor 视图中设置一个变量,而是init在我的 JavaScript 中调用一个函数,并将我需要由 Razor 解释的所有参数传递给它。

所以代码看起来像这样:

MyScript.init({
    editUserUrl: "@Url.Action("Edit","User")",
    anotherUrl: "@Url.Action("AnotherUrl", "User")"
})

然后在 JavaScript 中:

var m_options;
MyScript.init = function(options) {
    m_options = options;
}

// use with m_options.editUserUrl here
$.ajax(
{
    type: "POST",
    url: m_options.editUserUrl,
    data: { 
        fileID: rightClickedFileId
    },
    success: function (data) {
    }
 });

我在这里写了一篇关于它的更详细的帖子:http: //blog.blanklabs.com/2015/02/aspnet-mvc-refactoring-friendly.html

于 2015-02-01T23:58:27.753 回答
1

你可以这样写

url:'/controllername/Actionname',
于 2017-03-31T10:27:12.327 回答