如何将具有动态值的javascript对象发布到mvc6控制器操作

本文关键字:对象 mvc6 操作 控制器 javascript 动态 | 更新日期: 2023-09-27 18:25:23

在一个asp.net5/mvc6项目中,我创建了一个页面来编辑Azure DocumentDB存储中的文档。我使用jquery将数据发布到控制器操作。

数据库中的示例文档如下所示:

{  
    "key": "name1",  
    "value": 23
}

属性值可以有不同的类型(数字、字符串等)。

在向控制器发布时,如何保持此值的动态?如果我创建一个这样的类,效果很好:

public class Setting
{
    {
        [JsonProperty(PropertyName = "key")]
        public string Key { get; set; }
        [JsonProperty(PropertyName = "value")]
        public string Value { get; set; }
    }
}

与操作中的强类型参数结合使用:

public async Task<IActionResult> Update(string collectionName, List<Setting> settings)

但现在该值的类型总是字符串。我试着在动作中使用这样的JObject:

public async Task<IActionResult> Update(string collectionName, List<JObject> settings)

但是,操作中反序列化的参数设置的所有属性都具有"null"值:

{  "key": null,  "value": null}

//编辑JS代码发布到动作的示例:

var data = {
    settings: [{ key: "test",  value: 123}]
}
$.ajax({
    url: 'controller/action',
    type: 'post',
    dataType: 'json',
    data: data
});

如何将具有动态值的javascript对象发布到mvc6控制器操作

创建这样的新视图模型。

public class CollectionSettings
{
    public string CollectionName { set; get; }
    public List<Setting> Settings { set; get; }
}

并将其用作你的行动方法的参数

[HttpPost]
public async Task<IActionResult> Update([FromBody]  CollectionSettings model)
{
     // to do : Do something useful.
     return new JsonResult(new {Status = "Success"});
}

当您从客户端发送数据时,请确保使用JSON.stringify方法将javascript对象转换为Json字符串,并将contentType属性值指定为"application/json"

下面的代码应该可以正常工作。

var items = [];
var item1 = {
    "key": "name1",
    "value": 23
};
items.push(item1);
var model = { CollectionName: "test", Settings: items };
$.ajax({
    url: "@Url.Action("Update","Home")",
    type: "POST",
    data: JSON.stringify(model),
    contentType: "application/json"
}).done(function(r) {
    console.log(r);
});