JavaScript 没有发布到带有隐式索引 ASP.NET MVC 中的正确操作

本文关键字:MVC NET 操作 ASP JavaScript 索引 | 更新日期: 2023-09-27 18:31:06

当我像这样冲浪到地址时:

服务器:端口/控制器

它会自动假定请求的操作是索引,因此显示的页面等效于以下内容:

服务器:端口/控制器/索引

我的问题是,当我在单击按钮时执行这样的事情时:

$(function () {
  $("#clickaroo").click(function (event) {
    event.preventDefault();
    $.post("Action", null, function () { ... });
  });
});

当我隐式访问索引时它会失败(即显示该操作的页面但 URL 不包含其名称),而在显式访问它时工作(即 URL 说 .../控制器/索引)。如果我然后将帖子更改为以下内容:

$.post("Controller/Action", null, function () { ... });

它适用于前者,但开始失败于后者。当然,我确实理解为什么 - location.href/Action 为后缀,如果没有控制器的名称或重复的名称,它会感到困惑。处理这个问题的最佳实践方法是什么?

  • RouteConfig.cs 文件四处走动?(听起来矫枉过正)
  • 在 JS 中添加条件?(感觉像巴阿德设计)
  • 强制 URL 显式后缀?(不确定如何)

JavaScript 没有发布到带有隐式索引 ASP.NET MVC 中的正确操作

最好的解决方案是使用 Url.ActionUrl.RouteUrl html 帮助程序方法来构建操作方法的正确相对 url。这将负责构建正确的URL,无论您当前所在的页面/视图如何。

var url1="@Url.Action("Create","Home")";
//use url1 now.

如果你在剃刀视图中有你的javascript,上面的代码将起作用。如果您的脚本位于外部文件中,则可以构建根目录的相对 url 并将其传递给您的 js 文件,并根据需要使用它来构建 url。确保在执行此操作时使用 javascript 命名空间,以避免全局 JavaScript 变量可能出现的问题。

因此,在您的剃须刀视图(布局文件或特定视图)中,您可以执行此操作。

<script>
    var myApp = myApp || {};  
    myApp.Urls = myApp.Urls || {};
    myApp.Urls.baseUrl = '@Url.Content("~")';
    myApp.Urls.jobListUrl= '@Url.Action("Index","jobs")';
</script>
<script src="~/Scripts/YourExternalJsFile.js"></script>

在您的YourExternalJsFile.js文件中,您可以像阅读它一样

var urlToJobIndex= myApp.Urls.jobListUrl;
// Or With the base url, you may safely add the remaining url route.
var createUrl= myApp.Urls.baseUrl+"home/create";

编辑 :如果您只是关心获取网站的根/基本网址,以便您可以附加它以获取您追求的另一个网址,您可以简单地使用 / 作为 url 的第一个字符。

   var createUrl= "/home/create";

对于锚标记用例中的特定点击事件,您只需读取链接的href属性值即可使用该值。

如果要对与链接的href属性值相同的操作方法进行 ajax 调用。

<a id="clickaroo" href="@Url.Action("Create","Customer")">Create<a/>

并在您的点击事件中获取 href 属性值

$(function(){
  $("#clickaroo").click(function(e){
    e.preventDefault();
    var u = $(this).attr("href");
    $.post(u,function(response){
    });
  });
});

如果要对链接的 href 属性值以外的其他操作方法进行 ajax 调用。

在这里,您可以使用数据属性将其他网址保留在链接标记标记中。

<a id="clickaroo" href="#" data-targurl="@Url.Action("Create","Customer")">Create<a/>

并在点击事件中获取"targurl"的数据属性值 $(function(){

  $("#clickaroo").click(function(e){
    e.preventDefault();
    var u = $(this).data("targurl");
    $.post(u,function(response){
    });
  });
});

您可以使用html5 attirbute,因为您有外部js文件,因此无法访问那里的razor,请在按钮上使用data-属性,然后通过点击句柄中的jquery选择URL,例如:

<button  id="clickaroo" data-url="@Url.Action("Action","Controller")">Click me</button>

然后在 js 文件中:

$("#clickaroo").click(function (event) {
    event.preventDefault();
    var button = $(this);
    $.post(button.data("url"), null, function () { ... });
  });