![](/img/trans.png)
[英]How to create customers api using ASP.NET MVC4 and Web API for predefined json result
[英]ASP.NET MVC4 Web API - Control over formatting of returned JSON and what is included?
我正在創建我的第一個ASP.NET MVC4 Web API。 我有一個包含約20個實體的數據庫,該實體已經創建並托管在Azure上,並使用Entity Framework將數據庫反向工程為POCO類。
他們最終看起來像這樣:
public class Activity
{
public Activity()
{
this.ActivityCategories = new List<ActivityCategory>();
this.ActivityImages = new List<ActivityImage>();
this.PerformedActivities = new List<PerformedActivity>();
this.UserActivities = new List<UserActivity>();
}
public int ActivityID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Nullable<int> Thumbnail { get; set; }
public virtual Image Image { get; set; }
public virtual ICollection<ActivityCategory> ActivityCategories { get; set; }
public virtual ICollection<ActivityImage> ActivityImages { get; set; }
public virtual ICollection<PerformedActivity> PerformedActivities { get; set; }
public virtual ICollection<UserActivity> UserActivities { get; set; }
}
然后,我創建了一個ApiController擴展類,其動作如下:
public IEnumerable<Activity> All()
{
return db.Activities.ToArray();
}
而且,正如預期的那樣,它返回了很長的JSON回復。 JSON回復包含Activity類中定義的所有內容。 但是,如果我不想包含所有內容,該怎么辦? 例如,我不想返回諸如UserActivities,PerformedActivities等之類的東西。
基本上,我希望我的JSON看起來像:
[
{
"id":"32",
"name":"this activity name",
"description":"blah blah",
"thumbnail":"http://mydomain.com/images/32/thumbnail.png",
"images": [
{
"name":"this image",
"url":"http://mydomain.com/images/32/1.png",
},
{
"name":"cool image",
"url":"http://mydomain.com/images/32/2.png",
},
],
},
...
]
(忽略JSON中的任何格式錯誤,只需非常快速地輸入示例即可)
注意,我也不必使用相同的屬性名稱。 有沒有一種有效的方法可以將數據整理成我想要的格式?
我的第一個想法是將每個活動復制到僅包含所需屬性的結構數組中。 有沒有更優雅的解決方案?
在這種情況下,DTO對象將為您提供幫助,DTO將為您的使用者提供足夠的數據,因此定義需要通過Web API傳輸數據的DTO。 在某些情況下,您可以通過EF使用模型,但是:
通常,EF會在后台生成動態代理,以支持延遲加載和跟蹤更改。 您可能會遇到的問題是序列化問題,因為Web API會序列化代理,而不是POCO對象。
向用戶傳輸過多不必要的數據將使HTTP請求變得繁重,並泄露數據泄漏。
違反關注點分離,當EF模型是域實體時,它們不承擔數據傳輸對象的責任。
在示例中,您可以定義ActivityDto
,並消除您提到的不必要的屬性:
public class ActivityDto
{
public string Name { get; set; }
public string Description { get; set; }
public Nullable<int> Thumbnail { get; set; }
public virtual Image Image { get; set; }
}
public IEnumerable<Activity> All()
{
return db.Activities.Select(a => new ActivityDto(){
Name = a.Name,
Description = a.Description,
Thumbnail = a.Thumbnail
// More properties if you need
}).ToArray();
}
如果您要尋找一種工具來自動將DTO映射到EF模型,請使用AutoMapper 。
在MVC中,實際上並不是將數據庫實體用作模型的最佳實踐,而是我將創建一個POCO(或更復雜的對象)作為ViewModel,然后再返回,該POCO僅包含視圖所需的數據(或本例中的API用戶)。 如果您只想操縱返回的數據,我不確定該怎么做,但是我知道WebAPI使用newtonsoft的JSON.NET庫輸出JSON,因此您將研究操縱它的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.