ASP.NET Core - 在没有 Ajax 的 javascript 中调用控制器方法

Posted

技术标签:

【中文标题】ASP.NET Core - 在没有 Ajax 的 javascript 中调用控制器方法【英文标题】:ASP.NET Core - Call controller method in javascript without Ajax 【发布时间】:2018-03-05 11:37:42 【问题描述】:

我想调用我的控制器“Project”的方法“EditProject”,参数是项目的 ID。

我见过很多人使用 Ajax,但问题是我想调用控制器,而控制器又会将用户重定向到视图“EditProject”,我不想停留在同一页面上

这是我在发现它不起作用之前尝试过的代码:

$('.edit-project').click(function (d) 
    var id = $(this).attr('data-projectId');

    $.ajax(
        url: '@Url.Action("EditProject", "Project")',
        data:  id: id ,
        type: "GET"
    ).done(function() 
        console.log("Done");
    );
    return false;
);

我也尝试过简单地使用

$.get("/Project/EditProject/" +id); 
window.location.href = '@Url.Action("EditProject", "Project")' + '/' + id;
window.location.href = ("/Project/EditProject/" +id);

但它会返回 404 错误。

调用的方法很简单:

[HttpGet]
[Authorize(Roles = "Professional")]
public async Task<IActionResult> EditProject(int id)

    Project p = await _unitOfWork.Projects.GetById(id);
     ViewData["Title"] = "Modification du challenge " + p.ProjectName;
     return View(p);

正如 Ajax 所期望的那样,它确实返回了视图,但它作为对 ajax 查询的响应返回它,因此它不会按照我的意愿重定向和显示视图。

【问题讨论】:

这是错字吗$.get("/Project/EditProject/ +id"); 你的意思是$.get("/Project/EditProject/" +id); 在我看来它只需要window.location.href = "/Project/EditProject/" + id; 是的,这是一个错字,我也尝试过 window.location.href,但它实际上从未从控制器调用该方法。我试过放一个断点,它永远不会停止。 【参考方案1】:

您只是想重定向到那里。

window.location.href = '@Url.Action("EditProject", "Project")' + '/' + id

可能有一种 MVC 方法可以将您的 id 传递给 @Url.Action,但我不太熟悉 - 字符串连接应该可以工作。

控制器可能不理解/1 的含义。您可能需要将其更改为以下内容:

[HttpGet("id", Name = "EditProject")]
[Authorize(Roles = "Professional")]
public async Task<IActionResult> EditProject([FromRoute] int id)

    Project p = await _unitOfWork.Projects.GetById(id);
     ViewData["Title"] = "Modification du challenge " + p.ProjectName;
     return View(p);

这告诉 MVC 期望你的参数来自路由。

【讨论】:

似乎没有从Controller调用方法,我的调试并没有停在里面的断点处,我完全确定方法名没有错别字 当您触发点击处理程序时,浏览器是否真的在某处导航? 它确实,它转到localhost:44311/Project/EditProject/1,这在技术上是我想要的,除了它由于某种原因没有调用控制器?【参考方案2】:

你可以这样做

window.location.href = '@Url.Action("EditProject", "Project",new  id = ID )';

如果您的默认路由没问题,您不必更改 Action 方法路由。

【讨论】:

以上是关于ASP.NET Core - 在没有 Ajax 的 javascript 中调用控制器方法的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core - 在没有Ajax的情况下调用javascript中的控制器方法

asp.net core mvc 异步表单(Ajax.BeginForm)

Asp.net Core 3.1 - 用 Ajax 打开视图?

ASP.NET Core 模型未通过 AJAX 绑定到控制器

CORS 不适用于从 Ajax 到 ASP.NET Core Web API 的调用

在 Asp.net Core 中使用 Ajax 的验证表单