使用 jsonData 作为键值在 asp 中发送混合数据:不使用值更新数据库

using jsonData as a key value to send mixed data in asp: Does not update the database with the values

尝试在 postman 中混合文件上传和 json 数据后,我终于找到了一种可以在同一个请求中发送它们的方法。因此,我已将我的 json 数据移动到 Postman 中的一个键,这样就可以使用表单数据(下图)发送文件。

在值内我有 JSON 数据如下:

{
   "WorkshopEmail":"workshopemail",
   "WorkshopContactperson":"workshopcontactperson",
   "WorkshopCellphone":"workshopcellphone",
   "Service":[
      {
         "service":"Claim Airbag",
         "RequestTypeId":"1",
         "DamageDate":"2021-05-03",
         "DamageKilometerreading":"213",
         "LatestServiceDate":"2021-05-03",
         "LatestServiceKilometer":"1223",
         "WorkshopDiagnos":"diagnos workshop",
         "CarOwnerDescription":"carownerdescription",
         "CategoryId":"25",
         "works":[
            {
               "title":"arbete 1 airbag",
               "chargePerHour":"11",
               "hours":"12",
               "price":"132.00",
               "id":"13926"
            },
            {
               "title":"arbete2 airbag",
               "chargePerHour":"1",
               "hours":"2",
               "price":"2.00",
               "id":"13927"
            },
            {
               "title":"part1 airbag",
               "pricePerUnit":"100",
               "quantity":"1",
               "price":"100.00",
               "id":"13928"
            },
            {
               "title":"part2 airbag",
               "pricePerUnit":"100",
               "quantity":"2",
               "price":"200.00",
               "id":"13929"
            }
         ]
      },
      {},
      {},
      {},
      {},
      {}
   ]
}

空的{}只是包含了更多的服务类型。现在,当我在 Postman 中发送请求时,我得到 200 OK,当我调试时,我可以看到以下内容(抱歉,如果图片模糊):

¨ 但是,我的数据库没有使用这些值进行更新。这是将数据插入表中的 class:

public async Task<bool> AddRequest(Request model, List<IFormFile> file, [FromForm] string jsonData)
{
    bool CreateRequest = true;
    int requestID = 0;
    int claimID = 0;
    //bool country = true;

    //First Create the Request
    foreach (Service item in model.Service) 
    {
        //First Create the Request
        if (CreateRequest)
        {

            var parameters = new DynamicParameters();
            parameters.Add("WorkshopEmail", model.WorkshopEmail);
            parameters.Add("WorkshopContactperson", model.WorkshopContactperson);
            parameters.Add("WorkshopCellphone", model.WorkshopCellphone);
            parameters.Add("DamageDate", model.DamageDate);
            parameters.Add("LatestServiceDate", model.LatestServiceDate);
            parameters.Add("LatestServiceKilometer", model.LatestServiceKilometer);
            parameters.Add("DamageKilometerreading", model.DamageKilometerreading);
            parameters.Add("CurrentKilometerreading", model.CurrentKilometerreading);
            parameters.Add("CarOwnerDescription", model.CarOwnerDescription);
            parameters.Add("WorkshopDiagnos", model.WorkshopDiagnos);
            parameters.Add("AmountIncVat", model.AmountIncVat);



            try
            { 
            var requestIDenum = await _sqlconnection.QueryAsync<int>($@"INSERT INTO [dbo].[Request]
                                                    (WorkshopEmail,WorkshopContactperson,WorkshopCellphone,DamageDate,LatestServiceDate,
                                                     LatestServiceKilometer,DamageKilometerreading,CurrentKilometerreading,
                                                     CarOwnerDescription,WorkshopDiagnos,AmountIncVat)
                                                    VALUES
                                                    (@WorkshopEmail,@WorkshopContactperson,@WorkshopCellphone,@DamageDate,@LatestServiceDate,
                                                     @LatestServiceKilometer,@DamageKilometerreading,@CurrentKilometerreading,
                                                     @CarOwnerDescription,@WorkshopDiagnos,@AmountIncVat);SELECT SCOPE_IDENTITY();",parameters);
            requestID = requestIDenum.First();
            CreateRequest = false;

            }
            catch(Exception ex)
            {

                int hej = 0;
            }
        }
        
        if (item.fileuploadresults != null)
        {
            foreach (FileUploadResult f in item.fileuploadresults)
            {
                var parameters = new DynamicParameters();

                parameters.Add("file", f.filename);

                var filemessage = await _sqlconnection.QueryAsync<int>($@"INSERT INTO [dbo].[OptionalFile] ([FileName])
                                                  VALUES (@file); SELECT SCOPE_IDENTITY();", parameters);



                int FileMessageID = filemessage.First(); 

                
                await _sqlconnection.QueryAsync<int>($@"INSERT INTO[dbo].[ClaimCrossOptionalFile]
                                                    (ClaimID,FileID)
                                                    VALUES
                                                    ({claimID},{FileMessageID});");
            }
        }
              

    return true;
    //return list;
}      

控制器:

 [HttpPost]
        public async Task<IActionResult> AddRequest(List<IFormFile> file, [FromForm] string jsonData)
        {
            // if (!ModelState.IsValid)
            // {

            Request request = JsonConvert.DeserializeObject<Request>(jsonData); 

            try
            {
                //await _request.AddRequest(request);
            }
            catch (Exception ex)
            {

                return BadRequest(ex.Message);
            }

            return Ok(); 
        }

接口:

Task<bool> AddRequest(Request model, List<IFormFile> file, [FromForm] string jsonData);

旁注:这是代码的一部分,因为我尽量保持简短,所以这里可能缺少一些 } 或某些东西,但没有问题。如果我应该添加整个代码,我也许可以将它发送到 link 或类似的东西,因为在这里上传会很多。

但是,我现在不知道如何处理这个问题。我以前没有使用过表单数据,至少没有将 json 作为值传递。也许我 missing/have 需要在控制器中使用 json 数据做些什么?我试过寻找解决方案,但我被困在这里。唯一的问题是数据库没有更新。

更新,型号:

 public class Work
    {
        //base for claim
        public string title { get; set; } = "";
        public string chargePerHour { get; set; } = "";
        public string hours { get; set; } = "";
        public string price { get; set; } = "";
        public string id { get; set; } = "";
        public string pricePerUnit { get; set; } = "";
        public string quantity { get; set; } = "";

        //service
        public int rentreasonId { get; set; } = -1;
        public int rentservicecartypeId { get; set; } = -1;

        //tyres
        public int tireserviceId { get; set; } = -1;

        public IList<TireType> tireTypes { get; set; }
        public IList<Labour> labours { get; set; }
        
        public DateTime DateFrom{ get; set; } = DateTime.Parse("1753-01-01");
        public DateTime DateTo { get; set; } = DateTime.Parse("1753-01-01");

        //Insurance
        public string totalAmount { get; set; }
        public string requestInsuranceVatID { get; set; }
        public string vat { get; set; } = "0.0";
        public string totalExclVat { get; set; }="0.0";
        public string totalIncVat { get; set; }="0.0";


    }

    public class Labour
    {
        public string title { get; set; } = "";
        public string chargePerHour { get; set; } = "";
        public string hours { get; set; } = "";

        public string price { get; set; } = "";
    }

    public class TireType
    {
        public string quantity { get; set; } = "";
        public string brand { get; set; } = "";
        public string model { get; set; } = "";

        public string pricePerUnit { get; set; } = "";
        public string price { get; set; } = "";

        public string tireTypeId { get; set; } = "";

        public string widthID { get; set; } = ""; 

        public string heightID { get; set; } = "";

        public string diameterID { get; set; } = "";
    }

    public class Request
    {
        public string WorkshopEmail { get; set; } = "";

        public string WorkshopContactperson { get; set; } = "";

        public string WorkshopCellphone { get; set; } = "";

        public int AmountIncVat { get; set; } = 0;

        #region Claim
        public DateTime DamageDate { get; set; } = DateTime.Parse("1753-01-01");

        public DateTime LatestServiceDate { get; set; } = DateTime.Parse("1753-01-01");

        public int LatestServiceKilometer { get; set; } = 0;

        public int DamageKilometerreading { get; set; } = 0;

        public int CurrentKilometerreading { get; set; } = 0;

        public string CarOwnerDescription { get; set; } = "";

        public string WorkshopDiagnos { get; set; } = "";

        //public string OptionalMessage { get; set; } = "";

        #endregion
        public IList<Service> Service { get; set; }

       
    }

    public class TireTread
    {
        public string tireserviceId { get; set; } = "";
        public string leftfront { get; set; } = "";
        public string rightfront { get; set; } = "";
        public string leftrear { get; set; } = "";
        public string rightrear { get; set; } = "";
        public string added1 { get; set; } = "";
        public string added2 { get; set; } = "";
        public string added3 { get; set; } = "";
        public string added4 { get; set; } = "";
        public string added5 { get; set; } = "";
    }

    public class TireMessage
    {
        public int tireserviceId { get; set; }
        public string message { get; set; }
    }

    public class Service
    {
     //   [JsonProperty("ServiceId")]
        public string RequestTypeId { get; set; } = "";
        public string CategoryId { get; set; } = "-1";
     
  

        public string OptionalMessage { get; set; } = "";

        public IList<Work> works { get; set; }
        public IList<TireTread> treads { get; set; }

        public IList<TireMessage> TireMessages { get; set; }

        //filuppladdning
        public IList<FileUploadResult> fileuploadresults { get; set; }
    }

    //filuppladdning
    public class FileUploadResult
    {
        //public IFormFile files { get; set; } 

        public string filename { get; set; }
    }

首先,json格式与机型structure.You不匹配,需要这样传json(注意DamageKilometerreadingLatestServiceKilometer,它们的类型是int,所以不要使用""):

{
   "WorkshopEmail":"workshopemail",
   "WorkshopContactperson":"workshopcontactperson",
   "WorkshopCellphone":"workshopcellphone",
   "DamageDate":"2021-05-03",
   "DamageKilometerreading":213,
   "LatestServiceDate":"2021-05-03",
   "LatestServiceKilometer":1223,
   "WorkshopDiagnos":"diagnos workshop",
   "CarOwnerDescription":"carownerdescription",
   "Service":[
      {
         "service":"Claim Airbag",
         "RequestTypeId":"1",
         "CategoryId":"25",
         "works":[
            {
               "title":"arbete 1 airbag",
               "chargePerHour":"11",
               "hours":"12",
               "price":"132.00",
               "id":"13926"
            },
            {
               "title":"arbete2 airbag",
               "chargePerHour":"1",
               "hours":"2",
               "price":"2.00",
               "id":"13927"
            },
            {
               "title":"part1 airbag",
               "pricePerUnit":"100",
               "quantity":"1",
               "price":"100.00",
               "id":"13928"
            },
            {
               "title":"part2 airbag",
               "pricePerUnit":"100",
               "quantity":"2",
               "price":"200.00",
               "id":"13929"
            }
         ]
      },
      {},
      {},
      {},
      {},
      {}
   ]
}

然后尝试在服务模型中添加public string service { get; set; }=""

我找到了解决方案,以防其他人遇到这个问题。我需要修改控制器并添加此代码:

 [HttpPost]
        public async Task<IActionResult> AddRequest(List<IFormFile> file, [FromForm] string jsonData)
        {
            Request request = JsonConvert.DeserializeObject<Request>(jsonData);

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            try
            {
                await _request.AddRequest(request, file, jsonData);

            }
            catch (Exception ex)
            {

                return BadRequest(ex.Message);
            }

            return Ok();
        }

基本上添加 request(我在方法的开头反序列化),并在等待请求中添加 filejsonData,解决了问题。至于文件上传,我也需要修改那个方法,把文件名存入数据库:

if (file != null)
                {

                    foreach (IFormFile f in file)
                    {
                        string filename = Path.GetFileName(f.FileName);
                        var parameters = new DynamicParameters();
                        parameters.Add("file", filename);

                        var filemessage = await _sqlconnection.QueryAsync<int>($@"INSERT INTO 
                        [dbo].[OptionalFile] ([FileName])
                        VALUES (@file); SELECT SCOPE_IDENTITY();", parameters);
    
                    }
                
                } 

将这些更改为可以在同一请求中发送包含 json 键值和多个文件的请求。