Asp.net &引用;“400错误请求”;使用带Web API的JQuery Ajax时出现可选参数异常错误

Asp.net &引用;“400错误请求”;使用带Web API的JQuery Ajax时出现可选参数异常错误,asp.net,razor,asp.net-web-api,Asp.net,Razor,Asp.net Web Api,我阅读了ASP.NET文档,现在就到了,但是我得到了我不理解的“400错误请求”异常错误 “可选参数”错误导致异常错误的原因是什么?解决方法是什么?异常错误是 --剪断-- {“Message”:“请求无效。”,“MessageDetail”:“参数字典包含方法”System.String Post(Int32)的不可空类型“System.Int32”的参数“id”的空条目”'在'BIO.Dealer.WebApp.WebApi.Member.AmazonServerDigitalLoanJac

我阅读了ASP.NET文档,现在就到了,但是我得到了我不理解的“400错误请求”异常错误

“可选参数”错误导致异常错误的原因是什么?解决方法是什么?异常错误是

--剪断-- {“Message”:“请求无效。”,“MessageDetail”:“参数字典包含方法”System.String Post(Int32)的不可空类型“System.Int32”的参数“id”的空条目”'在'BIO.Dealer.WebApp.WebApi.Member.AmazonServerDigitalLoanJacketController'中。可选参数必须是引用类型、可为null的类型,或者声明为可选参数。“} --剪断--

下面是源代码

//Web API Config
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "MemberApi",
            routeTemplate: "WebApi/Member/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

//JQuery
var jsonRequest = { "Id": 3, "Name": "Scott Fletcher"};

$.ajax({
    type: "POST",
    async: false, /*false, //This need to be synchronous to the client can wait for webserver response...*/
    url: https://localhost:44301/WebApi/Member/AmazonServerDigitalLoanJacket/Upload",
    data: JSON.stringify(jsonRequest),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (parmData, parmTextStatus, parmXmlHttpRequest) {
        //alert("AjaxStatus: " + parmTextStatus + "\nReadyState - " + parmXmlHttpRequest.readyState + "\nStatus: " + parmXmlHttpRequest.status + "\nStatusText: " + parmXmlHttpRequest.statusText + "\nResponseText: " + parmXmlHttpRequest.responseText);
        jsonResponse = parmData;
    },
    error: function (parmXmlHttpRequest, parmTextStatus, parmErrorThrown) {
        //alert("AjaxStatus: " + parmTextStatus + "\nReadyState - " + parmXmlHttpRequest.readyState + "\nStatus: " + parmXmlHttpRequest.status + "\nStatusText: " + parmXmlHttpRequest.statusText + "\nResponseText: " + parmXmlHttpRequest.responseText);
    }
});

//Web API Controller
public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class AmazonServerDigitalLoanJacketController : ApiController
{
    [ActionName("Upload")]  //Upload File(s)...
    [HttpPost]
    public string Post(Foo parmFoo)
    {
        return "object of ID " + parmFoo.Id.ToString() + " (Upload) & Name: " + parmFoo.Name;
    }
}

当您的方法只接受一个参数时,您正在传递多个参数。但在此之前,它被默认路径阻塞。将这些数据值放在一个表单中并序列化它,以便它可以被解释为您期望的对象。否则,请求两个参数,一个int id和一个字符串名,然后您可以自己创建对象。

您如何将其更改为接受JSON请求?就像我在上一次看到的这个例子一样,您需要用两个输入序列化一个表单,它们的名称与对象的属性匹配,这就是允许您映射到对象的绑定魔法。或者编辑Post()方法以接受Id和名称,这样您传递的两个参数实际上与方法签名匹配。这似乎不管用。JSON对象中的Id和名称与控制器上的Id和名称匹配。还是一样的错误。我更新了上面的示例。它的意思是Id为null。JSON Serialize确实有帮助。我发现了问题,我需要将“/{action}”添加到WebApiConfig的路由配置中。这解决了我的问题。谢谢你的帮助。