ASP.NET Core Jquery Ajax发送数组失败

问题描述 投票:0回答:1

我尝试将多语言对象发送到ProductsController,控制器接受无错误的方法,并且对象具有正确的IdTag,但Names Briefs 数组为空

我尝试了HttpPOST,HttpPUT,HttpOptions,但没有成功。

JS代码:

    var dataToSend = new FormData();

    var Names = $.makeArray();
    var Briefs = $.makeArray();

    Names.push({ LangCode: 'en', Value: 'TEST' });
    Names.push({ LangCode: 'de', Value: 'TOST' });

    Briefs.push({ LangCode: 'en', Value: 'FOO' });
    Briefs.push({ LangCode: 'de', Value: 'BAR' });

    dataToSend.append("Id", productId);
    dataToSend.append("Tag", "SampleTag");
    dataToSend.append("Names", Names);
    dataToSend.append("Briefs", Briefs);


    $.ajax({
        type: 'PUT',
        contentType: 'application/json; charset=utf-8',
        url: "/api/products/" + productId,
        data: dataToSend,
        processData: false,
        contentType: false,
        success: function (data) {
            DoST();
        },
        error: function (xhr, textStatus, error) {
            var response = JSON.parse(xhr.responseText);
            DoST();
        }
    });

C#代码如下:我使用LangValue对象通过应用程序传递了不同的语言值,它可以按预期工作,但不能通过Ajax填充!


    public class LangValue
    {
        public string LangCode { get; set; }
        public string Value { get; set; }
    }

    public class Product
    {
        public int Id { get; set; }
        public string Tag { get; set; }
        public IList<LangValue> Names { get; set; }
        public IList<LangValue> Briefs { get; set; }
    }

    [HttpPut("{id}")]
    public async Task<IActionResult> PutProductLangs(int id, Product product)
    {
        PRODUCT Id and Tag are filled but Names and Briefs arrays are EMPTY!!!
        return NoContent();
    }


jquery ajax asp.net-core controller asp.net-ajax
1个回答
0
投票

如果使用FormData发送数据,则需要.append()每个单独的[[name / value]到FormData。由于它是一个集合,因此您必须包含集合索引器(必须从零开始并且是连续的),如下所示:

formData.append("obj[0].Field1", field1Val) formData.append("obj[0].Field2", field2Val) ... formData.append("obj[1].Field1", field1Val) formData.append("obj[1].Field2", field2Val)
因此将您的代码更新为如下所示:

JS

<script> $("#btn").click(function () { function addItems(formdata, Items, name) { for (var i = 0; i < Items.length; i++) { addSingleItem(formdata, Items[i], name + "[" + i + "]"); } } function addSingleItem(formdata, item, name) { for (var key in item) { formdata.append(name + "." + key, item[key]); } } var Names = $.makeArray(); var Briefs = $.makeArray(); Names.push({ LangCode: 'en', Value: 'TEST' }); Names.push({ LangCode: 'de', Value: 'TOST' }); Briefs.push({ LangCode: 'en', Value: 'FOO' }); Briefs.push({ LangCode: 'de', Value: 'BAR' }); var formData = new FormData(); formData.append("Id", productId); formData.append("Tag", "SampleTag"); addItems(formData, Names, "Names"); addItems(formData, Briefs, "Briefs"); $.ajax({ type: 'PUT', url: "/api/products/" + productId, data: formData, processData: false, contentType: false, success: function (data) { alert("success!"); }, error: function (xhr, textStatus, error) { var response = JSON.parse(xhr.responseText); alert("error!"); } }); }); </script>

Controller

[HttpPut("{id}")] public async Task<IActionResult> PutProductLangs(int id, [FromForm]Product product) { return NoContent(); }
© www.soinside.com 2019 - 2024. All rights reserved.