如何通过 jquery ajax 将特定对象的序列发送到 Mvc 核心操作

How To Send Sequence of Specific Object To Mvc Core Action through jquery ajax

我创建了一个函数,负责创建和发送 json :

function Send(op) {
    var tr = $(op).parents('tr');
        var item = [];

        $(tr).find("td").each(function () {
            item.push($(this).find("input").prop("name") + '":' + '"' + $(this).find("input").val());
        });
        var myJsonString = JSON.stringify(item);

        $.ajax({
            url: '/Home/Edit',
            data: myJsonString,
            type:'post',
            contentType: 'application/json; charset=utf-8',
            cache: false,
            success: function () {
                alert('send is okay')
            }
        });
}

到 IActionResult :

   [HttpPost]
    public ActionResult Edit([FromBody]Hazine hazine)
    {
        return View();
    }

但它(编辑操作)无法从 jquery 获取对象。 所以此操作已成功调用,但 hazine 为空!

我从 console.log 创建的 json 是:

["id\":\"4","undefined\":\"undefined","undefined\":\"undefined","HazineType1\":\"1","HazineType2\":\"1","SendDate\":\"5","ProjectId\":\"1","Mablagh\":\"1","MablaghPaid\":\"1","HazineDate\":\"1","HazineDateLong\":\"1","HazineTitle\":\"11111","HazineComment\":\"1","ForoshgahName\":\"1","PayLastDate\":\"1","PayDateLong\":\"111111111","UniqueId\":\"1111","SaveDate\":\"8888","SaveDateLong\":\"888","SendDate\":\"5","SendDateLong\":\"5"]

怎么了?

为了使用 FromBody 将对象发送到控制器,json 字符串应该映射参数。

对于您的操作,它接受一个对象,但是对于您的 json,您发送的是一个集合对象。

尝试如下操作:

function Send(op) {
    var tr = $(op).closest('tr');
    var item = {};

    $(tr).find("td").each(function () {
        item[$(this).find("input").prop("name")] = $(this).find("input").val();                    
        });
        var myJsonString = JSON.stringify(item);
    console.log(myJsonString);
        $.ajax({
            url: '/Home/Edit',
            data: myJsonString,
            type:'post',
            contentType: 'application/json; charset=utf-8',
            cache: false,
            success: function () {
                alert('send is okay')
            }
        });
}

如果你使用的是.net core 3.0,你还需要通过安装Microsoft.AspNetCore.Mvc.NewtonsoftJson来配置json序列化器,并像

那样配置
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews().AddNewtonsoftJson();
}
 public class Hazine:TableBase
{


    [Key]
    public string UniqueId { get; set; }



    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    public int HazineId { get; set; }


    public int HazineType1 { get; set; } // check paid , check




    public int ProjectId { get; set; }



    public int Mablagh { get; set; }




    public int MablaghPaid { get; set; }




    [StringLength(150)]
    public string HazineDate { get; set; }




    public long HazineDateLong { get; set; }



    [StringLength(150)]
    public string HazineTitle { get; set; }




    [StringLength(350)]
    public string HazineComment { get; set; }



    [StringLength(150)]
    public string ForoshgahName { get; set; }




    [StringLength(150)]
    public string PayLastDate { get; set; }




    [StringLength(150)]
    public long PayDateLong { get; set; }               

}

    public class TableBase
{
    [NotMapped]
    public bool isModified { get; set; }



    [StringLength(150)]
    public string SaveDate { get; set; }



    public long SaveDateLong { get; set; }



    [StringLength(150)]
    public string SendDate { get; set; }




    public long SendDateLong { get; set; }

}

控制台日志:

{"HazineId":"4","UniqueId":"1111","HazineType1":"1","HazineType2":"1","SendDate":"5","ProjectId":"1","Mablagh":"1","MablaghPaid":"1","HazineDate":"1","HazineDateLong":"1","HazineTitle":"11111","HazineComment":"1","ForoshgahName":"1","PayLastDate":"1","PayDateLong":"111111111","SaveDate":"8888","SaveDateLong":"888","SendDateLong":"5"}

有效:

   [HttpPost]
    public IActionResult Edit([FromBody]Object data)
    {
       Hazine hazineJson =JsonConvert.DeserializeObject<Hazine>(data.ToString());

        hazine.Update(hazineJson);
        return View();
    }

无效:

[HttpPost]
    public IActionResult Edit([FromBody]Hazine data)
    {

        hazine.Update(data);
        return View();
    }

在第二个函数中无法调用并发生错误 500