【问题标题】:Ajax to .NET Can't bind multiple parameters errorAjax 到 .NET 无法绑定多个参数错误
【发布时间】:2017-10-16 23:50:39
【问题描述】:

当我尝试像这样使用 ajax 传递值时:

 $.ajax({
     type: "PUT",
     dataType: 'json',
     url: "http://localhost:52930/api/person/",
     contentType: "application/json; charset=utf-8",
     data: {persoon1, persoon2, file}
 })
     .done(function( msg ) {
         alert("Test")
     });

其中person1和2是对象,文件是字节数组(JSON)。

在.NET中使用这个函数

    public IHttpActionResult Put(Person personFrom , Person personTo , byte[] file)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest();
        }
        _personRepository.EncrypFileAndSendToPerson(file, personFrom  , personTo);
        return CreatedAtRoute("DefaultApi", new { controller = "Person", id = personTo.Id }, personTo);
    }

这是 person 类:

public class Person
{
    private RSAWithRSAParameterKey _rsaParameters;
    public Person()
    {
        _rsaParameters = new RSAWithRSAParameterKey();
        _rsaParameters.AssignNewKey();
        PrivateKey = _rsaParameters._privateKey;
        PublicKey = _rsaParameters._publicKey;
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
    public string Salt { get; set; }
    public byte[] File { get; set; }
    public string PrivateKey { get; set; }
    public string PublicKey { get; set; }
    public EncryptedPacket Packet { get; set; }       
}

为什么我不断收到此错误,我该如何解决?

完全错误

{Message: "An error has occurred.",…}
ExceptionMessage
:
"Can't bind multiple parameters ('personFrom' and 'file') to the request's content."
ExceptionType
:
"System.InvalidOperationException"
Message
:
"An error has occurred."
StackTrace
:
"   at System.Web.Http.Controllers.HttpActionBinding.ExecuteBindingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
↵   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
↵--- End of stack trace from previous location where exception was thrown ---
↵   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
↵   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
↵   at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext()
↵--- End of stack trace from previous location where exception was thrown ---
↵   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
↵   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
↵   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"

编辑:

这是我在 console.log() data 中的值时得到的数据

{"personFrom":{"Id":2,"Name":"Sinan","Password":"wachtwoord2","Salt":"22ad8a4c-3175-4049-a9e0-f4f383c1cd09","File":null,"PrivateKey":"<RSAKeyValue><Modulus>3A86Zo99HaROAME/yU7POcogo4Zru62F+7PAXONv3Jm8l2RMfb4QlcCF483kXV85paVpbgI7en3O5eiFoTEUVUXP9InjpNg7X9jah8tJFLRvzIU74vHP7ccLXgOV5ztGUEGW2ESbpT6gkvNS6XvMyMS+r8rQt1mvNp3lhAErK81a6Pr1npVmew9cghikY5NOk5WcaAeh8pB4hPeGbTg33BRzEN+w8IeJh73EwKDz8fKklqbFv90qRUPciKKUStyCxTCU4yg43de4qcuzNXMXqjFF8NY0JXu+6L6yuRvrdFoBN4OWe2GLEGxVoemDWvO7rwP9qkSq51Bk9CnW4bd98w==</Modulus><Exponent>AQAB</Exponent><P>9dfUtHHiLbySstMMquL0QTazj8AI/S2IBpJX9kXgRQ9SaJ3l6VlbMmSTvjY3MgRK6OF3MISMlBRqAa0ptxttXyh1fEvS7B44XVrOOREEQQkRBo5Ly02vXFYudBApgd68EijBDcI0l3v7CzQu6Ng/ROLAYnrd4K9AzZ+cppRZ6tE=</P><Q>5SayKSK/R6I944RMeA/DYfep/KXiePSyE/MyI2A72q2bG8MaLG8w1JN1p5T5tfB2Tgyn/ePHjVoP7CYoRQz6PIcyxDDqRzyw5tDpQ0Rc3lTcJkM1WmWyB+9NDIV1mmhDgyUWAssS0IhKg/6HOat2dBbEPE+d9qgi9tjfQetKRYM=</Q><DP>9FLnxd1Yl3PNp4MwF7UuYpFmqvqC9HsHsOBIIy0W0guELwydredsRwzF+EgRWtgBSqiot8NDovcW00uxJZVQgT3IZRtGJ/twsPbJ9NUAkVHdZdKNaSNvoCjWSeq2Faey6akvE+lqMxK4UE4wQKCJYICqCjVpxR7nHHQAT10ob8E=</DP><DQ>RXjm2LvVHAWfF8Q7XscAqEnqulMchylAd/XqRHlfjBvIA7Gx1LjdKAWQzP7IehVt+JmzsLCHBl7ApwqmeNDHaORgSsS9sl0/EKtTnPYz5Z/6oosLuN1ODUPKqzom/moP1cm/k5c3nAtF9CCNpLlMD0P7uIE21doBx67WeOi5urs=</DQ><InverseQ>R8GMrONl4TchpuUPv3DxfbqEAqGH5zhgOtPuvLLMfGXXCo0xWJpFDK7k7x6qt5oMjMnqhoqW/VAx3quOkO79cHdcDRoMGjAjuSNj+dQ+dH/qyAf18qsq0mmHxpsB3LUpe3TLDvRQETqTemuc6hmGo4kNLeV7w9aab3PuJxpduWI=</InverseQ><D>PqoteMA6okLEHa3qQqKpGy1GfxqLuj2PLl6BFFKF671xuXDL4XDK20IgPn9GnRo9WcDRVYzYMCj8TncY+o512lSPg/TyOOKEgeZIUKwgav946LY2GAnBKtZoE8UUnmzAOKF82agr5HIBmuckgK2K4s839+pa5iNpZDWxgpYsm4OPMQ4PPGJVkjQEDW9MZn1/gMrmsBsilOjLSq338Hk9Gz3kcXvM/KVACDkWY3EdUOQO9JNsEvbIaBXH3qUNNZ6xoW2ZjzLBtoe975tFByjG2rz3pHb9rpt3nQ9JC1cCzkj1+uxwlR2nRlISZt8sIA8eCV40f6h6Kn15M88TV6VkkQ==</D></RSAKeyValue>","PublicKey":"<RSAKeyValue><Modulus>3A86Zo99HaROAME/yU7POcogo4Zru62F+7PAXONv3Jm8l2RMfb4QlcCF483kXV85paVpbgI7en3O5eiFoTEUVUXP9InjpNg7X9jah8tJFLRvzIU74vHP7ccLXgOV5ztGUEGW2ESbpT6gkvNS6XvMyMS+r8rQt1mvNp3lhAErK81a6Pr1npVmew9cghikY5NOk5WcaAeh8pB4hPeGbTg33BRzEN+w8IeJh73EwKDz8fKklqbFv90qRUPciKKUStyCxTCU4yg43de4qcuzNXMXqjFF8NY0JXu+6L6yuRvrdFoBN4OWe2GLEGxVoemDWvO7rwP9qkSq51Bk9CnW4bd98w==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>","Packet":null},"personTo":{"Id":3,"Name":"Lennert","Password":"wachtwoord3","Salt":"daa4ccff-5764-41eb-b151-8b3cbc0f870b","File":null,"PrivateKey":"<RSAKeyValue><Modulus>44KWMkW7KFrnaK4qD90VSfiwLdttfpOYK+pApqXSAg2NnFLGxvI7AHoOWwQEQiYtQwyDjkNuxWsWxhYeMV9XwNaoba6hH/4iFx4ZR68FCJD5KsSfPuk+X4cf/R5auMKvLboKOFz9yRFYnBN17uQyI8NPhjTaAIRPJ5eTr/H+D6ug9hnwtz7tc/vpBPyjyomTcnUa9GVOrYAQ0RtsAvTJ2of9mT3G67WUhzIMqKsAFP6mObyAcyFgQx0uFdVFSFCOw26a0ASZM3juEVDT4OSWIZz3tWLD2acSPJTNxJFyvUMeEyc4dLPnPgZF/VypIjnuu4CZ/pplqS6N5Z3QhWgS2Q==</Modulus><Exponent>AQAB</Exponent><P>+Kk3iG6f03CG8yPWvN0CfkpHpVq2yvSguujscE6ZGW57cPYP3J02quqGvnCT5UUNxiyZt1tu/xh4HcapT2HVN1H4kCZdsKdbovGvjdAHzgZdNXunpLzIwvCbp9wskOqGClyZXKO1kEFhQ+u+69PuH9ifE8yxvzanfLc5irNY908=</P><Q>6jmP4ikBIawVTk5DVKKbvw9tkN0GdbTzMU7wTYHYoh61/k438AoOcnngr96orbqSQNtFucQ5IRonkHDqjjZrPlCYh+VpGCKR4Vl3+TWBc/ad1xiBRcmgfGyd72CRqYU3sjsfNe1zYkgvJqpUf0frafUz2tqBR+Bk/jC/RAhRyVc=</Q><DP>Ch6AxwmRcX5Tz5M2yurHjjIhpkYByFKaM+EEtjFMo69OULOCw7yWG/B9WUSlkB/2RolMHB0ZcEIjqTqLa1KU5bJtRhh5mZXF8eSZ+1Bq8ORraKDGmrqgBObbvsIEAkW4/LT1/MIgwmUWuzfdxiUSvLMJDjo3RYvI1xdxvQY9aZs=</DP><DQ>MbpK2/9MqDN6yoc/MEbdvjCuWGU0q+ThBQT3a903eyP+C6HbqnDYJGHP3EbvlQLZbj+fjBMm9eoxoC74/Xx8RFykJaYFLASa6Dcwi45aj546YKJpP8HQ+tmsplfgVRddfc+jjrV9G86rhBABpIxGZNaUTdC6ReJUTstWsED77D0=</DQ><InverseQ>pQnuS/ovatWINEwmdZBRfyjUtDesiYrMFF45RtInMaoXe0aNQFuWqIuBejleuijSESk6rFwurmg/GpB2fZJ2yRfxp5VYfQqnJjXDIMjEc2aphvc82e4TM7JGJrmeyhOsjjTA0whW6ua/d9rH/baFy02o0qI739vvBamL95GZvL0=</InverseQ><D>Prz9nzpkfKHoy5Cvr7U3UDFAoDyw6qVX4tBT6MC0c3V6Vh/rieQ1ihGekNHAPN+bPrCePKZyzwUTgCeMRvA0Wky3oJt1+kUR8I8PyJlGiZC07WrQQUB/v0cbdqkeunGRbkot1FIsd/yNE2k4bdrGyt7quKctcNQLoe7mPrA8b+ROsrRgoSpmV+3cX6CUWA2ireuI789mIgXGJ+5Fik9iq8gRMvOsAqCC8fivBxlxAmIYA1+jANFgbcu17bvalI4z58C99VDYfqp/zjIIbDs4rmtqVDzIJfDYDFjyZi1EivgbpDakj2V7yqHvkYF8lbSSUIrCQ7WROjokQ4bzwcav+w==</D></RSAKeyValue>","PublicKey":"<RSAKeyValue><Modulus>44KWMkW7KFrnaK4qD90VSfiwLdttfpOYK+pApqXSAg2NnFLGxvI7AHoOWwQEQiYtQwyDjkNuxWsWxhYeMV9XwNaoba6hH/4iFx4ZR68FCJD5KsSfPuk+X4cf/R5auMKvLboKOFz9yRFYnBN17uQyI8NPhjTaAIRPJ5eTr/H+D6ug9hnwtz7tc/vpBPyjyomTcnUa9GVOrYAQ0RtsAvTJ2of9mT3G67WUhzIMqKsAFP6mObyAcyFgQx0uFdVFSFCOw26a0ASZM3juEVDT4OSWIZz3tWLD2acSPJTNxJFyvUMeEyc4dLPnPgZF/VypIjnuu4CZ/pplqS6N5Z3QhWgS2Q==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>","Packet":null},"file":"{\"1\":115,\"2\":100,\"3\":100,\"4\":115,\"5\":100,\"6\":97}"}

【问题讨论】:

    标签: jquery asp.net .net ajax


    【解决方案1】:

    这很可能是因为参数不是可选的,并且您没有将FromBody 属性应用于参数。试试这个:

    public IHttpActionResult Put(
        [FromBody] Person personFrom,
        [FromBody] Person personTo,
        [FromBody] byte[] file)
    {
        ...
    }
    

    如果它没有帮助尝试创建新模型以将请求映射到该模型将包含所有属性:

    public class PutModel
    {
        public Person PersonFrom {get; set;}
        public Person PersonTo {get; set;}
        public byte[] File {get; set;}
    }
    

    并在您的操作中定义单个参数:

    public IHttpActionResult Put([FromBody] PutModel model)
    {
        ...
    }
    

    并确保属性名称按照@Jay 的建议正确。

    data: {
        "personFrom": persoon1,
        "personTo": persoon2,
        "file": file
    }
    

    另外,根据控制台中的消息,文件是一个对象,而不是JS中的数组。尝试明确地将其设为Converting a JS object to an array 中的数组:

    var array = $.map(file, function(value, index) {
        return value;
    });
    

    【讨论】:

    • 它现在发出 400 错误请求。
    • [[123]、[34]、[49]、[34]、[58]、[49]、[49]、[53]、[44]、[34]、[ 50], [34], [58], [49], [48], [48], [44],…] 这就是数组现在的样子
    • @SinanSamet,数组看起来不正确,应该没有带有一个值的内部数组。只是简单的数组。 400 是因为你 return BadRequest(); 我想。
    • 是不是数组的原因?
    • 这解决了问题!该阵列导致 400 错误。非常感谢!
    【解决方案2】:

    你需要这样传递价值

        $.ajax({
        type: "PUT",
        dataType: 'json',
        url: "http://localhost:52930/api/person/",
        contentType: "application/json; charset=utf-8",
        data: {
            "personFrom": persoon1,
            "personTo": persoon2,
            "file": file
        }
    })
            .done(function (msg) {
                alert("Test")
            });
    

    【讨论】:

    • 我编辑了我的问题以包含我发送的确切数据
    • 你能不能把 byte[] 文件改成 string file 试一试
    【解决方案3】:

    试试下面的代码

     $.ajax({
                        type: 'PUT',
                        url: 'http://localhost:52930/api/person/',
                        dataType: 'application/json',
                        data: {
                             personFrom : persoon1, 
                             personTo : persoon2,
                             file: file                       
                        },
                        success: function (data) {
                            alert("Application Updated Successfully");
                        },
                        error: function (err) { 
                        }
                    });
    

    您想在 javascript 中填充对象,例如:

    var persoon1 = {
    Id: $("#id").val(),
    Name: $("#Name").val(),
    }
    

    你的方法是这样的:

    [ResponseType(typeof(void))] //whatever the response
    public IHttpActionResult Put(Person personFrom , Person personTo , byte[] file)
        {
        }
    

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 2017-04-27
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多