使用Web Api 2控制器

时间:2016-05-07 18:13:56

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

我有一个名为Folder的自引用模型,还有一个名为Content的实体,它包含文件夹实体。

public class Folder : BaseEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public virtual Folder Parent { get; set; }
    public virtual ICollection<Folder> Children { get; set; }
}


public class Content : BaseEntity
{
    [Key]    
    public int Id { get; set; }
    public string Title { get; set; }
    public string HTML { get; set; }
    public string Summary { get; set; }
    public int XmlConfigId { get; set; }
    public int FolderId { get; set; }
    public virtual Folder Folder { get; set; }
}

这是我的应用程序Db上下文

public class ApplicationDbContext: DbContext
{
        public DbSet<Folder> Folders { get; set; }
        public DbSet<Content> Contents { get; set; }

        public ApplicationDbContext() : base("ProjectDB") {
            Database.SetInitializer<ApplicationDbContext>(null);
        }

}

如果我使用剃刀视图显示数据,并且我能够访问内容实体内的文件夹属性,一切正常。

问题是当我尝试使用Web API显示数据时。

我的网络API

public class ContentApiController : ApiController
{
    [HttpGet]
    public IEnumerable<Content> GetAllContents()
    {
        return _unitofwork.Contents.GetAllContents();
    }
}

在Web API上,GetAllContents()函数只返回直接来自文件夹DBSet的实体模型。它没有调用ToList()函数,因为我想做延迟加载。以下是GetAllContents()函数的代码。

public IEnumerable<Content> GetAllContents()
{
    return ApplicationDbContext.Contents.Include(c=>c.Folder);
}

所以为了使这个工作,我必须添加。

Configuration.LazyLoadingEnabled = false;

到我的applicationDbContext构造函数,我真的不想要。 还有

Global.asax中

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

WebApiConfig

JsonMediaTypeFormatter jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().Single();
            jsonFormatter.UseDataContractJsonSerializer = false;
            jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
            jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            jsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;

有没有办法在不关闭延迟加载的情况下公开json数据。感谢。

1 个答案:

答案 0 :(得分:0)

只需在您的查询上致电ToList,或者更好的是ToListAsync

[HttpGet]
public async Task<IEnumerable<Content>> GetAllContents()
{
    return await _unitofwork.Contents.GetAllContents().ToListAsync;
}

即使您启用了LazyLoading,也无法避免在将数据返回到客户端之前实现数据(并让Serializer能够正常工作)。

在你的MVC示例中,框架本身在您的视图中枚举结果(我猜),因此您不是直接调用ToList,但在您的方案中,您必须实现你的实体明确。

请注意,在控制器中调用ToList / ToListAsync时没有性能问题。