C# Web Api 调用未从 jquery 调用

Posted

技术标签:

【中文标题】C# Web Api 调用未从 jquery 调用【英文标题】:C# Web Api call is not invoking from jquery 【发布时间】:2019-06-14 05:51:55 【问题描述】:

我正在从 jQuery 脚本调用 POST web-api,但数据未绑定。 Pagenull

jQuery

$("document").ready(function()
    myTimer= setInterval( "StartTimer()", 1000);
);
function StartTimer()

    $.ajax(
        type: 'POST',
        contentType: "application/x-www-form-urlencoded",
        url: "/api/sitehit/LogHit/",  //method Name 
        data:  'Page=test' ,
        dataType: 'text/plain',
        error: function (msg) 
            alert(msg.responsetext);
        
    ).fail(function () 
        alert("error logging hit");
    ).success(function () 
        alert("success logging hit");
    );
    clearInterval(myTimer);

C# 代码

public class SiteHitController : ApiController

    [HttpPost]
    public void LogHit(string Page)  // Page not binding
    
        var c= Page; // Page is null
    

【问题讨论】:

没有帮助。我正在调用 API/Controller/Action/StringData 但仍然没有结果 看看***.com/questions/19093603/simple-post-to-web-api.. 还要确保您的路由设置正确,因为没有为方法指定路由属性... 【参考方案1】:

控制器中没有为/api/sitehit/LogHit 设置路由。 ApiController 的工作方式与常规 MVC 控制器不同。除非您指定,否则操作的名称不是端点的路由。

您可以将路由属性添加到控制器操作。

[Route("LogHit")]
[HttpPost]
public void LogHit(string Page)


或者(假设控制器上没有其他 HttpPost 方法)将jQuery url 更改为url: '/api/sitehit'

有多种方法可以绑定数据,具体取决于您要发送的内容类型。假设您想使用 JSON,您可以执行以下操作。

创建要绑定的模型并将[FromBody] 添加到控制器操作参数中:

public class MyModelDto

    public string Page  get; set; 


[Route("LogHit")]
[HttpPost]
public void LogHit([FromBody] MyModelDto model) // add FromBody here

    // model.Page will contain "test"

然后通过使用JSON.stringify() 对数据进行字符串化,确保您在 ajax 调用中发送 JSON。

$.ajax(
    type: 'POST',
    contentType: "application/json",
    url: "/api/sitehit/LogHit",
    data: JSON.stringify(Page: 'test'),  // use JSON.stringify()
    dataType: 'json',
    success: function (data) 
        // can use response data here
        alert("success logging hit");
    ,
    error: function (msg) 
        alert(msg.responsetext);
    
);

这应该现在正确绑定到您的控制器。

如果您要发送表单数据x-www-form-urlencoded,请改用[FromForm],您不需要使用JSON.stringify(),但在这种情况下,参数应以查询字符串形式发送:page=test&prop2=test2

希望这会有所帮助。

【讨论】:

如何绑定,请分享完整信息而不是部分信息。我现在正在使用`contentType:“application/x-www-form-urlencoded”,url:“/api/sitehit/LogHit/”`,现在它的命中但数据没有绑定 @Sujoy 更新了答案。有多种绑定方式,具体取决于内容类型。对于 JSON,使用 [FromBody],如果是表单数据,则使用 [FromForm] 你为什么要把事情复杂化。我只想将它绑定为字符串,因为我的控制器操作接受字符串。此外,这不是路由问题,因为我的代码可以很好地使用整数参数。 当然每个人都知道这是可能的,但问题是“如何”。你的回答不够充分。我修改了问题,你可以再试一次。 谢谢,我没有要求不同的方式。我一直在寻找最简单的方法,可能是字符串。我自己找到了一个简单的方法。【参考方案2】:

以下代码有效:

    $.ajax(
        type: 'POST',
        //contentType: "application/json; charset=utf-8",
        url: "/api/sitehit/LogHit?Page=" + window.location.href,   
        //dataType: 'json',
        error: function (msg) 
            alert(msg.responsetext);
        
    );

【讨论】:

以上是关于C# Web Api 调用未从 jquery 调用的主要内容,如果未能解决你的问题,请参考以下文章

服务器未从 restkit 的 web 服务调用接收正文对象

API Gateway v2 未从 OPTIONS 调用返回 CORS 标头

在 C# 中调用 web api

调用 Selector 方法时未从 Superview 中删除视图

Fiddler 没有看到来自 C# HttpClient() 的 API 调用

使用 Response.Write JSON 输出从 Jquery 调用 c# asmx Web 服务