【问题标题】:How to bind JavaScript array of JSON objects to a List of objects in viewModel. dotnetcore mvc如何将 JSON 对象的 JavaScript 数组绑定到 viewModel 中的对象列表。 dotnetcore mvc
【发布时间】:2020-04-11 23:31:09
【问题描述】:

这是我的 json 对象的 javascript 数组

var pObjIds = [{"Id":"2","Name":"small"},{"Id":"3","Name":"average"}]

我已将表单字段收集到这样的 FormData() 中

var form = new FormData($(this)[0]);

我已经像这样将 json 对象数组附加到 FormData

form.append("Availability", pObjIds);

我有一个带有属性的 ViewModel

public List<Item> Availability { get; set; }

Item 类如下所示

public class Item
{
    [JsonProperty(PropertyName = "Id")]
    public int Id { get; set; }

    [JsonProperty(PropertyName = "Name")]
    public string Name { get; set; }
}

我的控制器接收表单数据的方法是

[HttpPost]
public IActionResult AddSupplier(SupplierVM vm, List<Item> list)
{
  if (ModelState.IsValid)
  {
  }
   return View("AddSupplier", vm);
}

我的意图是将 formData 中附加的可用性绑定到属性 public List&lt;Item&gt; Availability { get; set; } 在 ViewModel 中。

上面的代码是我尝试过的,但它没有约束力。总是返回 count=0 表示可用性。

是我做错了什么还是有更好的方法可以做到? 我在控制器中使用了 FormCollection,但仍然没有看到附加的 json 对象数组,但我可以在控制台中记录它并看到它已成功附加。

我正在使用 dotnet core 3.0 mvc。

提前致谢。

这是调用 AddSupplier 的客户端代码

var form = new FormData($(this)[0]);
                form.append("Availability", pObjIds);
                $.ajax({
                    type: 'POST',
                    url: '/supplier/addsupplier/',
                    data: form,
                    processData: false,
                    contentType: false,
                    datatype: 'json',
                    success: function (result) {
                        if (result.status == false) {
                            swal({
                                title: 'Error!',
                                text: result.msg,
                                icon: "error",
                                button: "Ok",
                            });
                        }
                    },
                    error: function () {
                        swal({
                            title: "Unknown Error!",
                            text: "unable to process request!",
                            icon: "error",
                            button: "Ok",
                        });
                    }
                });

【问题讨论】:

  • 您能否发布更多关于如何在客户端调用AddSupplier 的代码?此外,this SO answer 可能是相关的
  • 感谢您的回复。我刚刚编辑了问题,包括关于如何在客户端调用 AddSupplier 的代码 sn-p

标签: javascript c# json json.net asp.net-core-mvc


【解决方案1】:

我有一个带有属性的 ViewModel

public List<Item> Availability { get; set; }

我的意图是将 formData 中附加的可用性绑定到 ViewModel 中的属性public List&lt;Item&gt; Availability { get; set; }

为了满足您的要求,您可以尝试为 FormData 对象附加值,如下所示。

var form = new FormData($(this)[0]);

//form.append("Availability", pObjIds);

$(pObjIds).each(function (index, el) {
    form.append(`Availability[${index}].Id`, el.Id);
    form.append(`Availability[${index}].Name`, el.Name);
});


$.ajax({
    type: 'POST',
    url: '/supplier/addsupplier/',
    data: form,
    processData: false,
    contentType: false,
    datatype: 'json',
    success: function (result) {
        // code logic here
        //...

在控制器动作中AddSupplier

[HttpPost]
public IActionResult AddSupplier(SupplierVM vm)
{
    //code logic here

查看模型类SupplierVM

public class SupplierVM
{
    public int Id { get; set; }

    //other properties

    public List<Item> Availability { get; set; }
}

测试结果

【讨论】:

  • 感谢您的回复。但是,JSON 对象中的两个属性是一起使用的,而且 formData 已经收集了表单元素,所以如果我循环添加它们单独的 json 数据,我将如何在控制器中动态获取它们。我刚试过,但它仍然返回 Count=0
  • if I loop through to add them json data individually, how are my going to get them dynamically in the controller 如上截图所示,你会发现数据会绑定到视图模型类的 Availability 属性,你可以通过控制器中的vm.Availability 获取数据行动。
  • I just tried but it is still returning Count=0您可以在浏览器网络选项卡上查看您发送的实际数据。
  • 请我检查过,但没有看到任何内容,或者我应该检查网络选项卡上的确切位置? @韩飞
  • 在网络选项卡中,您可以选择您发送到'/supplier/addsupplier'的请求并检查实际表单数据是否类似于this
猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多