【问题标题】:WebAPI Return Json from Other ModelsWebAPI 从其他模型返回 Json
【发布时间】:2016-05-20 00:15:07
【问题描述】:

我的搜索措辞可能有误,但我还没有找到任何与从控制器返回“更多”json 相关的内容,而不仅仅是我正在使用的控制器/模型。我所读到的内容让我想要相信我的数据库存在关系或映射问题,但同样,我不确定从哪里开始。

目前我的控制器只返回:

{
  "Id": 43,
  "CreatedDate": "2015-02-09T00:00:00",
  "CreatedBy": "username",
  "ClosedDate": "2015-02-09T00:00:00",
  "ClosedBy": "username",
  "Revision": "1"
}

我正在尝试返回如下内容:

{
    "JobDetails": {
        "Tasks": [{
            "Id": 1,
            "TaskName": "string",
            "TaskDescription": "string",
            "TaskOrder": 1,
            "TimeCompleted": "DateTime",
            "CompletedBy": "string",
            "Notes": [{
                "Note": "This is note 1.",
                "CreatedDate": "DateTime",
                "CreatedBy": "string"
            }, {
                "Note": "This is note 2.",
                "CreatedDate": "DateTime",
                "CreatedBy": "string"
            }]
        }]
    }
}

内容来自我的“JobsController”,在您可以看到填充其他字段的 POST 之后。

// POST: api/Jobs
[Route("api/Jobs/PostJob/", Name="PostJobRoute")]
[ResponseType(typeof(Job))]
public IHttpActionResult PostJob(Job job)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    //Run query to get a list of all tasks that have the group ID passed
    IQueryable<Task> TasksQuery =
        from c in db.Tasks
        select c;

    //Execute and loop results...
    IQueryable<Task> TasksByGroupId = TasksQuery.Where(c => c.TaskGroupId == 1);

    foreach (var task in TasksByGroupId)
    {
        db.JobDetails.Add(new JobDetail()
        {
            //Generate a new job detail for this job
            JobId = job.Id,
            TimeCompleted = DateTime.Now,
            CompletedBy = "ocodyc",
            TaskId = task.Id,
            TaskIdOrder = task.TaskOrder
        });
    }

    //TODO: Return a list of the task + notes

    db.Jobs.Add(job);
    db.SaveChanges();

    return CreatedAtRoute("PostJobRoute", new { id = job.Id }, job);
}

这似乎是映射问题吗?我尝试将导航属性添加到“jobs”到“jobdetails”,但这没有用。

【问题讨论】:

  • 你应该创建一个类来表示你的数据并返回它,而不是仅仅返回 db 对象或尝试重构你的 db。如果您因为无法关联而无法获取该额外数据,那么是的,您遇到了映射问题。
  • 这是有道理的。我会从那个方向努力。
  • 创建一个与您想要的输出相同的视图模型。然后将您的域模型映射到视图模型中。您可以手工制作或使用AutoMapper 进行映射。
  • 您的 TODO 评论走在了正确的轨道上

标签: c# json asp.net-web-api routes asp.net-web-api2


【解决方案1】:

您将返回传递给操作的对象,这就是原因。不要返回job,做这样的事情:

var jobDetailList = new List<JobDetail>();
foreach (var task in TasksByGroupId)
{
    jobDetailList.Add(new JobDetail()
    {
        //Generate a new job detail for this job
        JobId = job.Id,
        TimeCompleted = DateTime.Now,
        CompletedBy = "ocodyc",
        TaskId = task.Id,
        TaskIdOrder = task.TaskOrder
    });
}

//TODO: Return a list of the task + notes

db.Jobs.AddRange(jobDetailList);
db.SaveChanges();

return CreatedAtRoute("PostJobRoute", new { id = job.Id }, jobDetailList.AsEnumerable());

aw04 是对的。您可能希望实现一个 DTO 模式并将您的域项目纳入该模式

【讨论】:

  • 添加该列表会给我一个错误,提示我无法从 List 转换为 Enumerable。
猜你喜欢
  • 2011-02-28
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-18
  • 2017-07-22
  • 2014-05-10
  • 2019-05-18
相关资源
最近更新 更多