問題
在常熟等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需策劃設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都全網(wǎng)營(yíng)銷,外貿(mào)網(wǎng)站制作,常熟網(wǎng)站建設(shè)費(fèi)用合理。
想創(chuàng)建一個(gè)從 ASP.NET MVCcontroller到 ASP.NET Web API controller的直接鏈接,或者反向鏈接。
解決方案
可以使用System.Web.Http.Routing.UrlHelp的實(shí)例來創(chuàng)建一個(gè)指向Controller的鏈接,來暴露 ApiController(作為 Url屬性)。著和在 RequestContext上一樣,會(huì)被附加到 HttpRequestMessage實(shí)例。為了達(dá)到這個(gè)目的,我們需要調(diào)用鏈接方法或路由方法,然后傳入 MVC路由的名稱和默認(rèn)路由(Controller名字,Action名字,以及 Action相關(guān)的參數(shù))。
在MVC Controller這邊,System.Web.Mvc.UrlHelp,掛在基礎(chǔ) MVC基礎(chǔ) Controller類,可以通過 HttpRouteUrl生成 Web API鏈接
工作原理
當(dāng)使用 ASP.NETWeb API作為現(xiàn)有 MVC應(yīng)用程序一部分的時(shí)候,有一種很常見的需求,就是在兩種類型的 Controller之間可以互相鏈接。當(dāng)我們從 Web API上創(chuàng)建一個(gè)到MVC Controller的鏈接的時(shí)候,實(shí)際上使用的方法和創(chuàng)建兩個(gè) Web API Controller之間鏈接的方法完全相同:UrlHelper中的鏈接或者路由。鏈接和路由生成的鏈接還是有一些區(qū)別的,
鏈接方法將會(huì)生成一個(gè)絕對(duì)鏈接
路由方法生成的是一個(gè)相對(duì)鏈接。
反過來,我們從MVC鏈接到 Web API的時(shí)候,HttpRouteUrl并不是 ASP.NET Web API程序集的擴(kuò)展方法,而是 UrlHelper類的成員,在System.Web.Mvc中。這個(gè) Helper使用了一個(gè)私有的常量叫做 httproute,每次使用 HttpRouteUrl的時(shí)候,他都會(huì)被添加到 RouteValueDictionray中。
注意我們將會(huì)在3-12的時(shí)候深入學(xué)習(xí)和理解引擎生成鏈接到路由背后的故事。
代碼演示
假設(shè)一個(gè)簡(jiǎn)單的關(guān)于書籍的Web應(yīng)用程序。如清單 1-10所示的簡(jiǎn)單的 Book模型,存儲(chǔ)使用的是內(nèi)存,配置了API/MVC路由。這個(gè)例子的目的是,在 Web API和 MVC控制器之間,完美的使用同一個(gè)模型。我們將使用在這個(gè)清單中的偽數(shù)據(jù)來說明 Web API和 MVC之間互相鏈接的情況。
清單 1-10. 模型案例,路由和內(nèi)存存儲(chǔ)
public class Book { public int Id { get; set; } public string Author { get; set; } public string Title { get; set; } public string Link { get; set; } } public static class Books { public static ListList = new List { new Book {Id = 1, Author = "John Robb", Title = "Punk Rock: An Oral History"}, new Book { Id = 2, Author = "Daniel Mohl", Title = "Building Web, Cloud, and Mobile Solutions with F#" }, new Book { Id = 3, Author = "Steve Clarke", Title = "100 Things Blue Jays Fans Should Know & Do Before They Die" }, new Book { Id = 4, Author = "Mark Frank", Title = "Cuban Revelations: Behind the Scenes in Havana " } }; } public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "BookPage", url: "books/details/{id}", defaults: new {controller = "BooksPage", action = "Details"} ); } } public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new {id = RouteParameter.Optional} ); } }
如清單1-11所示,這段代碼是為了創(chuàng)建一個(gè)從Web API到 MVC Controller的鏈接。BooksPageController負(fù)責(zé)處理書籍。為了生成鏈接,我們可以調(diào)用 UrlHelper的鏈接方法,然后傳相關(guān)路由的值。
清單 1-11 ASP.NET Web API ApiController 鏈接到 MVC Controller
public class BooksController : ApiController{ public Book GetById(int id) { var book = Books.List.FirstOrDefault(x => x.Id == id); if (book == null) throw new HttpResponseException(HttpStatusCode.NotFound); book.Link = Url.Link("BookPage", new {controller = "BooksPage", action = "Details", id}); return book; }
反方向的鏈接,如清單1-12所示,從MVC Controller到 ApiController。在這樣的情況下,使用一個(gè) MVC特定的方法-UrlHelper,他是由 HttpRouteUrl擴(kuò)展的方法。
清單 1-12. 從 MVC Controller 鏈接到 ASP.NET Web API
public class BooksPageController : Controller{ public ActionResult Details(int id) { var book = Books.List.FirstOrDefault(x => x.Id == id); if (book == null) return new HttpNotFoundResult(); book.Link = Url.HttpRouteUrl("DefaultApi", new {controller = "Books", id}); return View(book); } }