日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Web API中展示实体Link相关的方面

發布時間:2025/3/15 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Web API中展示实体Link相关的方面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

有時候,向服務端請求一個實體,我們希望返回如下的格式:

?

links: [
??? href: http://localhost:8901/api/user/diaries/2013-08-17,
??? rel: "self",
??? method: "GET",
??? isTemplated: false
],
currentDate:"2013-08-17"

?

首先抽象出一個與Link相關的類:

?

public class LinkModel {public stirng Href{get;set;}public stirng Rel{get;set;}public string Method{get;set;}public bool IsTemplated{get;set;} }

?

再放到某個視圖模型中:

?

public class DiaryModel {//存儲和模型相關的鏈接public ICollection<LinkModel> Links{get;set;}public DateTime CurrentDate{get;set;} }public class Diary {public int Id{get;set;}public DateTime CurrentDate{get;set;} }

?

ModelFactory用來實現視圖模型和領域模型之間的轉化。

?

public class ModelFactory {private UrlHelper _urlHelper;public ModelFactory(HttpRequestMessage request){_urlHelper = new UrlHelper(request);}//領域模型轉換成視圖模型public DiaryModel Create(Diary d){return new DiaryModel(){Links = new List<LinkModel>{CreateLink(_urlHelper.Link("Diaryis", new {diaryid=d.CurrentDate.ToString("yyyy-MM-dd")}),"self");},CurrentDate = d.CurrentDate}}public LinkModel CreateLink(string href, string rel, string method = "GET", bool isTemplated = false){return new LinkModel(){Href = href,Rel = rel,Method = method,IsTemplated = isTemplated}}//視圖模型轉換成領域模型public Diary Parse(DiaryModel model){try{var entity = new Diary();var selfLink = model.Links.Where(l => l.Rel == "self").FirstOrDefault();if(selfLink != null && !string.IsNullOrWhiteSpace(selfLink.Href)){//從Uri中取出主鍵var uri = new Uri(selfLink.Href);entity.Id = int.Parse(uri.Segments.Last());}entity.CurrentDate = model.CurrentDate;return entity;}catch(Exception ex){}} }

?

Diaries這個controller略,路由方面:

?

//api/user/diaries //api/user/diaries/2001-01-01 config.Routes.MapHttpRoute(name: "Diaries",routeTemplate: "api/user/diaries/{dairyid}",defaults: new {controller="diaries", diaryid=RouteParameter.Optional} )

?

這樣,在客戶端發出 http://localhost:8901/api/user/diaries/2013-08-17 GET請求,得到如下的響應:

?

links: [
??? href: http://localhost:8901/api/user/diaries/2013-08-17,
??? rel: "self",
??? method: "GET",
??? isTemplated: false
],
currentDate:"2013-08-17"

在返回分頁相關的action中,也可以返回相關的Link部分。

先定義一個基類控制器:

?

public abstract class BaseController : ApiController {ICountingKsRepository _repo;ModelFactory _modelFactory;public BaseController(ICountingKsRepository repo){_repo = repo;//寫在構造函數里的話有點遲,必須等實例化_modelFactory才有值//_modelFactory = new ModelFactory(this.Request); }protected ModelFactory TheModelFactory{get{if(_modelFactory == null){_modelFactory = new ModelFactory(this.Request, TheRepository);}return _modelFactory;}}protected ICountingsRepository TheRepoisitory{get{return _repo;}} }

?

可見,把共同的部分封裝到基類控制器中是很好的習慣,然后基類控制器的子類通過屬性獲取一些方面。

再到具體的控制器:

?

public class FoodsController : BaseController {ICountingKsRepoisotry _repo;ModelFactory _modelFactory;public FoodsController(ICountingKsRepository repo) : base(repo){}const int PAGE_SIZE = 50;public object Get(bool includeMeasures = true, int page = 0){IQueryable<Food> query;if(includeMeausres){query = TheRepository.GetAllFoodsWithMeausres();}else{query = TheRepository.GetAllFoods();}//方便統計總數var baseQuery = query.OrderBy(f =>f.Description);//using System.Web.Http.Routingvar helper = new UrlHelper(Request);var links = new List<LinkModel>();if(page > 0){links.Add(TheModelFactory.CreateLink(helper.Link("Food", new {page = page - 1},"prevPage"));}if(page < totalPages - 1){links.Add(TheModelFactory.CreateLink(helper.Link("Food", new {page = page + 1},"nextPage"));}//把上一頁和下一頁的url保存下來//var prevUrl = page > 0 ? helper.Link("Food", new {page = page - 1}) : "";//var nextUrl = page > 0 ? helper.Link("Food", new {page = page + 1}) : "";//輸出總數var totalCount = baseQuery.Count();var totalPages = Math.Ceiling((double)totalCount/PAGE_SIZE);var result = baseQuery.Skip(PAGE_SIZE * page).Take(PAGE_SIZE).ToList().Select(f => TheModelFactory.FoodFromDomainToView(f));//方便客戶端接收return new{TotalCount = totalCount,TotalPages = totalPages,Result = result,Links = links//PrevPageUrl = prevUrl,//NextPageUrl = nextUrl, }}public FoodModel Get(int foodid){return TheModelFactory.FoodFromDomainToView(TheRepository.GetFood(foodid));} }

?

客戶端請求:localhost:8901/api/nutrition/foods

{
??? totalCount:800,
??? totalPages:151,
??? links: [
??????? {
??????????? href: http://localhost:8901/api/nutrition/foods?page=1,
??????????? rel: "prevPage",
??????????? method: "GET",
??????????? isTemplated: false,
??????? },
??????? {
??????????? href: http://localhost:8901/api/nutrition/foods?page=2,
??????????? rel: "nextPage",
??????????? method: "GET",
??????????? isTemplated: false
??????? }
??? ],
??? result: [...]
}


另外,還可以控制序列化過程。

在LinkModel這個視圖中:

?

public class LinkModel {public stirng Href{get;set;}public stirng Rel{get;set;}public string Method{get;set;}public bool IsTemplated{get;set;} }

?

在顯示的時候,可能不想讓IsTemplated顯示出來,如何在序列化的過程中做到呢?

--通過jsonFormatter.SerializerSettings.Converts屬性,用來控制序列化為json數據時的顯示方式。

在WebApiConfig.cs中:

?

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault(); jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNameContractResolver(); jsonFormatter.SerializerSettings.Converts(new LinkModelConverter());

?

而LinkModelConverter類需要繼承JsonConverter類。

?

public class LinkModelConverter : JsonConverter {public override bool CanConvert(Type objectType){return objectType.Equals(typeof(LinkModel));}public override object ReadJson(JsonReader reader, Type object){return reader.Value;}public override void WriteJson(JsonWriter wrtier, object value){var model = value as LinkModel;if(model != null){wirter.WriteStartObject();writer.WirteProeprtyName("href");writer.WriteValue(model.Href);writer.WriteProeprtyName("rel");writer.WriteValue(model.Rel);if(!model.Method.Equals("GET",StringComparison.ordinalIgnoreCase)){writer.WritePropertyName("method");writer.WriteValue(model.Method);}if(model.IsTemplated){writer.WriterPropertyName("isTemplated");writer.WriteValue(model.IsTemplated);}writer.WriteEndObject();}} }

?

轉載于:https://www.cnblogs.com/darrenji/p/5144162.html

總結

以上是生活随笔為你收集整理的ASP.NET Web API中展示实体Link相关的方面的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线香蕉 | 天码人妻一区二区三区在线看 | 中文字幕视频二区 | 致单身男女免费观看完整版 | 日本a级网站 | 中文字幕第12页 | 一级少妇毛片 | 色爱视频 | 人人舔人人 | 麻豆精品久久久 | 欧美色图狠狠干 | 男人舔女人下部高潮全视频 | 欧美日韩3p | 欧美a一级片| 可以在线观看的黄色 | 天堂av√| 欧美亚洲一区二区三区 | 豆花在线观看 | 91成人精品 | 国产精品suv一区二区 | 国产乡下妇女做爰毛片 | 99精品久久99久久久久 | 香蕉视频网站在线 | 中文字幕成人在线观看 | 不用播放器的av网站 | 久久久香蕉视频 | 成人免费激情视频 | 国产精品视频导航 | 日韩精品视频观看 | www.香蕉网 | 性色av网| 久久国产精品无码一级毛片 | 91精品一区二区三区四区 | 欧美一区二区三区婷婷 | 久久人妻一区二区 | 天天久久久| 亚洲欧洲日产av | 日韩熟女一区二区 | 91网站免费在线观看 | 午夜黄色大片 | 亚洲人成人一区二区在线观看 | 婷婷丁香六月天 | 动漫美女被吸乳奶动漫视频 | 性欧美在线观看 | 五月婷婷视频在线 | 久久久久久久久久一级 | 丝袜视频在线观看 | 午夜在线视频播放 | 中文字幕巨乳 | 超碰人人在线观看 | 色玖玖综合 | 精品久久ai | 牛牛影视一区二区 | 亚洲а∨天堂久久精品2021 | 激情小说专区 | 日韩精品人妻一区二区中文字幕 | 日韩精品一区二区三区在线播放 | 青青青在线视频观看 | 夜久久 | 师生出轨h灌满了1v1 | 亚洲国产精品成人午夜在线观看 | 日韩亚洲欧美在线 | www.激情网 | 激情小说一区 | 韩国黄色网 | 婷婷色在线观看 | 亚洲精品在线看 | 亚洲精品理论片 | 好吊日av | 亚洲一区免费在线 | 欧美乱插 | yellow免费在线观看 | 黄色片欧美 | 一区二区三区免费在线视频 | 可以免费看的av | 香蕉视频网页 | 91免费播放 | 婷婷狠狠 | 午夜国产福利在线 | 国产香蕉97碰碰碰视频在线观看 | 日韩精品激情 | 99久久精品无码一区二区毛片 | 中文字幕精品视频在线 | 日韩中文电影 | 欧美色图狠狠干 | 99国产视频在线 | 女同一区二区 | 久久中文字幕网 | 欧美成人久久久 | 视频久久 | 精品中文字幕视频 | 欧美怡春院 | 国产91丝袜在线18 | 丁五月 | 少妇高潮久久久久久潘金莲 | 欧美老熟 | 欧美高清精品 | 久久亚洲AV无码 | 99精品欧美一区二区三区综合在线 |