我目前正在为我的应用程序开发一个小型REST API。它工作正常。但是有一个问题。返回给用户的结果包含太多数据。我的控制器看起来像这样:
public JsonResult Profile(string name)
{
var encodedName = HttpUtility.HtmlEncode(name);
var n = encodedName.Replace('+', ' ');
var profile = profileSource.GetProfileForName(n);
if (profile == null)
{
HttpContext.Response.StatusCode = 404;
}
// XXXXX: how to remove certain fields from the profile?
return Json(profile, JsonRequestBehavior.AllowGet);
}
知道解决这个问题的最简洁方法是什么?有没有办法注释配置文件模型,以便某些字段不会被序列化?我猜或者我可以为这个特定情况构建一个自定义模型,或者以某种方式破解JsonResult。但是,这些方法中的任何一种都会增加一些额外的开销。
答案 0 :(得分:2)
您可以使用LINQ select方法投影到匿名类型。
答案 1 :(得分:2)
您应该使用Profile的属性子集来执行自定义对象。然后将原始对象转换为新的DTO对象。 (提示:尝试AutoMapper)。序列化并返回。
答案 2 :(得分:0)
return Json(new{profile.FirstName, profile.LastName, profile.OtherFields}, JsonRequestBehavior.AllowGet);
答案 3 :(得分:0)
我最终使用了继承。基本上我有一个“共享”模型(基类)和一个派生它并向其添加一些额外字段的模型。在源代码中,我只是为我的REST API构建一个共享实例,而应用程序的另一部分则使用派生的实例。非常简单,似乎运作良好。