【问题标题】:Cannot hit API controller action from AJAX post request无法从 AJAX 发布请求中命中 API 控制器操作
【发布时间】:2017-10-06 22:05:04
【问题描述】:

我们正在移动我们的服务器端逻辑以通过 API 调用。我无法从我的 AJAX 调用中获得要执行的操作。谁能告诉我我的代码有什么问题以及为什么我收到一个错误说它无法在控制器中找到操作?

控制器动作

[System.Web.Http.HttpPost]       
public HttpResponseMessage assignViews(string selectedViews, string volIds)
{
     return new HttpResponseMessage(HttpStatusCode.OK);
}

AJAX 请求

self.saveViews = function () {

        var data = {
            selectedViews: self.selectedViews().toString(),
            volIds: populateSelectedVolIds().toString()
        };

        var jsonData = ko.toJSON(data);

        $.ajax({
            url: "../../ja/ClientView/assignViews",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            cache: false,
            data: jsonData,
            success: handleViewsForClientSuccess,
            error: handleEditViewsErrors
        });
 };        

路由

public override void RegisterArea(AreaRegistrationContext context)
    {           
        RouteTable.Routes.MapHttpRoute(
            "ja",
            "ja/{controller}/{id}",
            new { action = "Index", id = UrlParameter.Optional, version = UrlParameter.Optional }
        );
    }

【问题讨论】:

  • [1] 您的 url 应该是“../../ja/ClientView”,所以不要包含 assignViews(操作名称),因为它不是您的路由的一部分。 [2] 最佳实践是使用模型而不是字符串作为参数。如果您使用模型,则绑定将正常工作。另一种选择是使用 [FromBody] 属性。
  • 取消操作名称不起作用。我将尝试创建一个模型对象并将其设置为参数。希望这会奏效。
  • 创建模型就像一种魅力。请将此作为答案,以便我接受。感谢您的帮助!

标签: c# .net ajax asp.net-mvc asp.net-web-api


【解决方案1】:

在 Route 注册中,您错过了添加 Action 占位符,而您默认将其标记为“Index”,这意味着您的 ajax 调用将尝试与 ActionMethod“Index”匹配。尝试将其更改为

ja/{controller}/{action}/{id}

另一个原因可能是参数不匹配。

【讨论】:

  • "消息":"在与请求匹配的控制器 'ClientView' 上找不到与请求 URI 'localhost:8088/ja/ClientView/… 操作匹配的 HTTP 资源。"
  • @DeanFriedland - 如果你能添加完整的控制器代码会很有帮助
  • 另外一件事,也可能是因为你的参数不匹配。在验证您的 Ajax 调用是否命中 Action 方法之前,尝试制作无参数的 Action 并删除 jsonData。
  • 有趣。让我尝试删除参数,看看是否可以让它达到我的断点。好主意...
  • 删除参数让我可以点击控制器动作。感谢您的帮助。
【解决方案2】:

[1] 从 url 中删除操作名称

不要在您的网址中包含操作名称,因为它不是您的路由的一部分。 HTTP 动词 POST 将找到您的操作,因为您使用此 VERB 标记了您的操作,并且您的 ajax 请求是一个 POST 请求。你的网址应该是:

url: "../../ja/ClientView"

[2] 使用模型作为参数

最佳做法是使用模型而不是字符串作为操作的参数。例如你在代码中创建这个模型:

public class MyModel
{
    public string selectedViews { get; set; }
    public string volIds { get; set; }
}

然后像这样改变你的动作:

[System.Web.Http.HttpPost]
public HttpResponseMessage assignViews(MyModel data)
{
     return new HttpResponseMessage(HttpStatusCode.OK);
}

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 2013-08-10
    • 2018-01-25
    • 1970-01-01
    • 2019-09-05
    • 2023-02-13
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多