Ajax 调用到 MVC 控制器 - URL 问题

IT技术 javascript jquery ajax asp.net-mvc-3
2021-01-27 10:33:13

我查看了之前发布的 jQuery/MVC 问题,但没有找到可行的答案。

我有以下 JavaScript 代码:

$.ajax({
    type: "POST",
    url: '@Url.Action("Search","Controller")',
    data: "{queryString:'" + searchVal + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "html",
    success: function (data) {
        alert("here" + data.d.toString());
    }
});

调用 Url 时,帖子如下所示:

NetworkError: 500 Internal Server Error - <a href="http://localhost/Web/Navigation/@Url.Action(%22Search%22,%22Chat%22)"></a> 

有人可以向我解释为什么它会像这样返回它(它背后的逻辑)并为我提供一个有效的解决方案。提前致谢!
PS:附加信息:%22 是 <<">> 字符的 URL 编码参考

6个回答

为了使其工作,必须将 JavaScript 放置在 Razor 视图中,以便该行

@Url.Action("Action","Controller")

由 Razor 解析并替换实际值。

如果您不想将 JavaScript 移动到您的视图中,您可以查看在视图中创建一个设置对象,然后从您的 JavaScript 文件中引用它。

例如

var MyAppUrlSettings = {
    MyUsefulUrl : '@Url.Action("Action","Controller")'
}

并在您的 .js 文件中:

$.ajax({
    type: "POST",
    url: MyAppUrlSettings.MyUsefulUrl,
    data: "{queryString:'" + searchVal + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "html",
    success: function (data) {
        alert("here" + data.d.toString());
    }
});

或可替换地看着撬动框架的建立Ajax的方法,让你可以实现同样没有“污染”与JS代码您的看法HtmlHelpers内。

谢谢你。经过数小时的挫折后解决了。
2021-03-16 10:33:13
行。我可能会因为这个问题而苦恼:我有一个视图文件,其中包含了您提供的代码。(<script type="text/javascript">您的代码</script>)。如何将其引用到外部 javascript 中:<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.treeview.js")"></script>
2021-04-03 10:33:13
先生……真棒!谢谢你的帮助 !
2021-04-06 10:33:13
我只是将 URL 添加到隐藏输入,然后从外部 .js 文件访问它们。
2021-04-09 10:33:13

在不涉及视图的情况下执行此操作的好方法可能是:

$.ajax({
    type: "POST",
    url: '/Controller/Search',
    data: { queryString: searchVal },
    success: function (data) {
      alert("here" + data.d.toString());
    }
});

这将尝试 POST 到 URL:

http://domain/Controller/Search(这是您要使用的操作的正确 URL)”

不要忘记“控制器”之前的斜线。它将创建一个不正确的 URL。byut 是的,这就是我现在使用的。
2021-03-26 10:33:13
请注意,如果您必须跨越区域边界,这将不起作用。
2021-04-13 10:33:13
除非您需要在 url 上使用服务器端逻辑,否则这会更清晰。此外,只要 json 的形状与 c# 对象的形状相匹配,MVC 就会将 data 属性中的任何字符串化 json 转换为 acton 的参数。
2021-04-14 10:33:13

您在代码示例中有类型错误。你忘记了大括号之后success

$.ajax({
 type: "POST",
 url: '@Url.Action("Search","Controller")',
 data: "{queryString:'" + searchVal + "'}",
 contentType: "application/json; charset=utf-8",
 dataType: "html",
 success: function (data) {
     alert("here" + data.d.toString());
 }
})

;

我有 currybracket 但它没有达到那个程度。问题出在 Url.Action 调用中
2021-03-16 10:33:13

Rob 的回答开始,我目前正在使用以下语法。由于这个问题受到了很多关注,我决定与您分享:

var requrl = '@Url.Action("Action", "Controller", null, Request.Url.Scheme, null)';
  $.ajax({
   type: "POST",
   url: requrl,
   data: "{queryString:'" + searchVal + "'}",
   contentType: "application/json; charset=utf-8",
   dataType: "html",
   success: function (data) {
   alert("here" + data.d.toString());
   }
  });

mihai-labo 的回答开始,为什么不完全跳过声明 requrl 变量并将 url 生成代码直接放在“url:”前面,例如:

 $.ajax({
    type: "POST",
    url: '@Url.Action("Action", "Controller", null, Request.Url.Scheme, null)',
    data: "{queryString:'" + searchVal + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "html",
    success: function (data) {
        alert("here" + data.d.toString());
    }
});