我在MVC 5应用程序中使用ADO.net作为我的ORM工具,问题是:
看这简单的一行:
public async Task<IHttpActionResult> GetMyMessage(int id)
{
List<Messages> messages = await db.Messages.Where(a => a.GroupID == id).ToListAsync();
return Ok(messages);
}
问题是我没有将任何数据(例如db.Messages.Include(something ...))包含到我的消息中,但仍然得到响应,例如所有用户集合以及与消息表相关的其他内容在数据库中。
我的全局asax是:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}
有谁知道如何摆脱这个链接的表,并有干净的JSON响应。否则,我将不得不采取一些解决方法并将其清除一点。?
这听起来像是ViewModels的情况。除了返回您的Message
实体,您还可以仅使用您关心该结果的属性来创建新类型。假设您的实体看起来像:
public class Message {
public int Id { get; set; }
public string Name { get; set; }
public virtual User User { get; set; }
public virtual Group Group { get; set; }
}
public class User {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Message> Messages { get; set; }
}
public class Group {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Message> Messages { get; set; }
}
并且您拥有一个Message
通过组ID检索a的端点,但是不希望获得有关User
或的任何信息Group
。创建一个ViewModel代表您想要的实际响应:
public class MessageViewModel {
public int Id { get; set; }
public string Name { get; set; }
}
然后将实体转换为ViewModel:
public async Task<IHttpActionResult> GetMyMessage(int id)
{
var messages = await db.Messages.Where(a => a.Group.Id == id).ToListAsync();
var models = messages.Select(
m => new MessageViewModel {
Id = m.Id,
Name = m.Name
}).ToList();
return Ok(models);
}
现在返回如下内容:
[{id: 1, name: 'SomeMessageName'}, {id: 2, name: 'SomeOtherMessageName'}, ...]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句