[英]C# Web API POST method for Json Multiple Array
我正在开发一个项目,该项目需要一个多数组Json的POST方法,其中数据位于5个不同的FK相关表上。
这是使用GET的Json输出:
{
"UserId": 1,
"Id": 1,
"ValueStoryName": "Value Story 101",
"Organization": "Charity Foundation",
"Industry": "Education",
"Location": "Singapore",
"AnnualRevenue": 1000,
"CreatedDate": "2017-07-27T00:00:00",
"ModifiedDate": "2017-01-01T00:00:00",
"BusinessValueToYou": [
{
"Id": 1,
"BVUSId": 1,
"BalanceSheet": 348,
"IncomeStatement": 546,
"ValueDriver": [
{
"BVUSId": 1,
"BVUId": 1,
"ValueDriver": "Give kind to others",
"Selected": true,
"TotalSavings": 0,
"SubLever": [
{
"BVUId": 1,
"BVUSVDId": 1,
"Item": "Help when needed",
"Selected": true,
"EstAnnualValue": 1,
"UserInput": [
{
"BVUSVDId": 1,
"BVUUIId": 1,
"Item": "Total Benefit",
"UserInput": 10
}
]
}
]
}
]
}
]
}
而我目前在控制器下的POST方法有:
// POST: api/ValueStories
[ResponseType(typeof(ValueStory))]
public async Task<IHttpActionResult> PostValueStory(ValueStory valueStory)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.ValueStories.Add(valueStory);
db.BusinessValueToYou.AddRange(valueStory.BusinessValueToYou);
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = valueStory.Id }, valueStory);
}
上面的代码只为valuestory和businessvaluetoyou添加数据,但无法为valuriver,subvaluedriver和userinput添加值。 我一直在大脑上讨论如何使这项工作,但没有运气。 任何帮助和参考将非常感谢。
这是我的BusinessValueToYou模型:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace AribaWebService.Models
{
public class BusinessValueToYou
{
// Foreign Key
public int Id { get; set; }
[Key]
public int BVUSId { get; set; }
public decimal BalanceSheet { get; set; }
public decimal IncomeStatement { get; set; }
// Navigation property
public virtual ValueStory ValueStory { get; set; }
public List<BVUValueDriver> ValueDriver { get; set; }
}
public class BVUValueDriver
{
// Foreign Key
public int BVUSId { get; set; }
[Key]
public int BVUId { get; set; }
[Required]
public string ValueDriver { get; set; }
public bool Selected { get; set; }
public decimal TotalSavings { get; set;}
// Navigation property
public virtual BusinessValueToYou BusinessValueToYou { get; set; }
public List<BVUSubValueDriver> SubLever { get; set; }
}
public class BVUSubValueDriver
{
// Foreign Key
public int BVUId { get; set; }
[Key]
public int BVUSVDId { get; set; }
[Required]
public string Item { get; set; }
public bool Selected { get; set; }
public decimal EstAnnualValue { get; set; }
// Navigation property
public virtual BVUValueDriver BVUValueDriver { get; set; }
public List<BVUUserInput> UserInput { get; set; }
}
public class BVUUserInput
{
// Foreign Key
public int BVUSVDId { get; set; }
[Key]
public int BVUUIId { get; set; }
[Required]
public string Item { get; set; }
public double UserInput { get; set; }
// Navigation property
public virtual BVUSubValueDriver BVUSubValueDriver { get; set; }
}
}
这是我的ValueStory模型:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace AribaWebService.Models
{
public class ValueStoryDetailDTO
{
// Foreign Key
public int UserId { get; set; }
[Key]
public int Id { get; set; }
public string ValueStoryName { get; set; }
public string Organization { get; set; }
public string Industry { get; set; }
public string Location { get; set; }
public string Currency { get; set; }
public double AnnualRevenue { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
// Navigation property
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public virtual User User { get; set; }
public List<AreaOfInterest> AreaOfInterest { get; set; }
public List<BusinessValueToYou> BusinessValueToYou { get; set; }
public List<BusinessValueFromSap> BusinessValueFromSap { get; set; }
}
}
通常我们不直接在web api中公开真实的Db实体,只需使用视图模型或DTO返回我们需要的内容以防止过度曝光。
您可以更改get方法以在单个模型中返回所需内容。
了解有关自动映射器的更多信息http://automapper.org/
构建更好的RESTful api: https : //www.codeproject.com/Articles/990492/RESTful-Day-sharp-Enterprise-Level-Application
对于您的问题,这是一个如何读取多个数组的示例:
// POST: api/ValueStories
public async Task<IHttpActionResult> PostValueStory(AbcViewModel viewModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//Manual map or use Automapper here
var entity = Mapper.Map<ValueStory>(viewModel);
db.ValueStories.Add(entity);
//db.BusinessValueToYou.AddRange(entity.BusinessValueToYou); // can map with automapper
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = entity .Id }, entity );
}
public class AbcViewModel
{
public int UserId { get; set; }
public int Id { get; set; }
public string ValueStoryName { get; set; }
public string Organization { get; set; }
public string Industry { get; set; }
public string Location { get; set; }
public string AnnualRevenue { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
public IEnumerable<BusinessValueToYouViewModel> BusinessValueToYou { get; set; }
}
public class BusinessValueToYouViewModel
{
public int Id { get; set; }
public int BVUSId { get; set; }
public int BalanceSheet { get; set; }
public int IncomeStatement { get; set; }
public IEnumerable<ValueDriverViewModel> ValueDriver { get; set; }
}
public class ValueDriverViewModel
{
public int Id { get; set; }
public int BVUSId { get; set; }
public int BVUId { get; set; }
public string ValueDriver { get; set; }
public bool Selected { get; set; }
public int TotalSavings { get; set; }
}
我设法使用AddRange使其工作。 谢谢您的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.