不知道如何设置Web API,检索数据有问题

时间:2018-11-19 12:21:30

标签: asp.net-mvc asp.net-web-api

几天前我遇到了这个问题,并以为我找到了解决方案 设置延迟加载:false。 但是我检索数据的问题仍然存在。 使用提琴手或前端应用程序,我无法检索数据,结果,我只有类似$ ref = 6的值 我认为这是某种一般设置问题,因此在这里我将提供一些信息。

控制器:

    [AllowAnonymous]
    [HttpGet]
    [Route("GetQuestionsByTestId/{id}")]
    public ICollection<Question> GetQuestionsByTestId(int id)
    {
        return db.Questions.Where(t => t.TestId == id)
            .Include(a => a.Answers)
            .Include(q=>q.Test)
            .Include(q=>q.Test.TestType)
            .ToList();
    }

identityModels:

   public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        this.Configuration.LazyLoadingEnabled = false; //false for Lazy Loading Off
        this.Configuration.ProxyCreationEnabled = false;
    }

WebApiConfig:

       var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);

问题模型:

    [Table("Question")]
    public class Question
     {
    public Question()
    {
        Answers = new HashSet<Answer>();
    }
    [Key]
    public int QuestionId { get; set; }
    [Required]
    public string Name { get; set; }
    public string Comment { get; set; }

    public int Difficulty { get; set; } 
    public byte Repeat { get; set; } // 0 - 255
    public bool IsLearned { get; set; }
    public string QuestionNumber { get; set; }

    public virtual ICollection<Answer> Answers { get; set; }


    [ForeignKey("Chapter")]
    public int ChapterId { get; set; }
    public Chapter Chapter { get; set; }


    [ForeignKey("Test")]
    public int TestId { get; set; }
    public Test Test { get; set; }

}

我用Chrome NETWORK检索到的退货:这是我的问题所在:

     [{$id: "1", QuestionId: 5, Name: "11", Comment: null, Difficulty: 0, Repeat: 0, 
     IsLearned: false,…},…]
     0: {$id: "1", QuestionId: 5, Name: "11", Comment: null, Difficulty: 0, Repeat: 0, 
     IsLearned: false,…}
     1: {$ref: "6"}

第二个对象不可见,只有这样:$ ref:“ 6”

请帮助,在这里失去希望。

1 个答案:

答案 0 :(得分:0)

我在这里猜测您正在使用Entity Framework来存储和检索数据。实际上,您不想直接从数据库返回数据/实体,您可能希望将数据映射到一组名为Data Transfer Objects(DTO)的类中。

您可以手动执行此操作,也可以使用AutoMapper之类的工具进行操作。

手动,您会做类似的事情

创建DTO类:

public class QuestionDTO
{
    public int QuestionId { get; set; }
    public string Name { get; set; }
    public string Comment { get; set; }

    public int Difficulty { get; set; }
    public byte Repeat { get; set; } // 0 - 255
    public bool IsLearned { get; set; }
    public string QuestionNumber { get; set; }
}

更改控制器方法:

[AllowAnonymous]
[HttpGet]
[Route("GetQuestionsByTestId/{id}")]
public IHttpActionResult GetQuestionsByTestId(int id)
{
    var questions = db.Questions.Where(t => t.TestId == id)
        .Include(a => a.Answers)
        .Include(q => q.Test)
        .Include(q => q.Test.TestType)
        .ToList();

    var questionDTOs = new List<QuestionDTO>();

    foreach (var question in questions)
    {
        questionDTOs.Add(new QuestionDTO
        {
            QuestionId = question.QuestionId,
            Name = question.Name,
            Comment = question.Comment,
            Difficulty = question.Difficulty,
            Repeat = question.Repeat,
            IsLearned = question.IsLearned,
            QuestionNumber = question.QuestionNumber
        });
    }

    return Ok(questionDTOs);
}

(我更改了返回类型,以便可以使用Ok方法返回200条消息,或者在需要时使用BadRequest()等返回其他状态代码,例如400)

使用DTO,您可以精确控制返回的数据,而不必担心更改诸如延迟加载或代理创建之类的东西