中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

[水煮 ASP.NET Web API2 方法論](1-4)從 MVC Controller 鏈接到 API Controller 以及反向鏈接

發布時間:2020-07-18 13:46:18 來源:網絡 閱讀:477 作者:水煮code 欄目:編程語言

問題

  想創建一個從 ASP.NET MVC controller ASP.NET Web API controller 的直接鏈接,或者反向鏈接。

 

解決方案

  可以使用 System.Web.Http.Routing.UrlHelp 的實例來創建一個指向 Controller的鏈接,來暴露 ApiController(作為 Url 屬性)。著和在 RequestContext 上一樣,會被附加到 HttpRequestMessage 實例。為了達到這個目的,我們需要調用鏈接方法或路由方法,然后傳入 MVC 路由的名稱和默認路由(Controller 名字,Action名字,以及 Action 相關的參數)。

MVC Controller 這邊,System.Web.Mvc.UrlHelp,掛在基礎 MVC 基礎 Controller類,可以通過 HttpRouteUrl 生成 Web API 鏈接


工作原理

當使用 ASP.NET Web API 作為現有 MVC 應用程序一部分的時候,有一種很常見的需求,就是在兩種類型的 Controller 之間可以互相鏈接。當我們從 Web API 上創建一個到MVC Controller 的鏈接的時候,實際上使用的方法和創建兩個 Web API Controller 之間鏈接的方法完全相同:UrlHelper 中的鏈接或者路由。鏈接和路由生成的鏈接還是有一些區別的,

  • 鏈接方法將會生成一個絕對鏈接

  • 路由方法生成的是一個相對鏈接。

反過來,我們從 MVC 鏈接到 Web API的時候,HttpRouteUrl 并不是 ASP.NET Web API 程序集的擴展方法,而是 UrlHelper 類的成員,在System.Web.Mvc 中。這個 Helper 使用了一個私有的常量叫做 httproute,每次使用 HttpRouteUrl 的時候,他都會被添加到 RouteValueDictionray 中。

 

注意 我們將會在 3-12 的時候深入學習和理解引擎生成鏈接到路由背后的故事。

 

代碼演示

假設一個簡單的關于書籍的 Web 應用程序。如清單 1-10 所示的簡單的 Book 模型,存儲使用的是內存, 配置了API/MVC 路由。這個例子的目的是,在 Web API MVC 控制器之間,完美的使用同一個模型。我們將使用在這個清單中的偽數據來說明 Web API MVC 之間互相鏈接的情況。

 

清單 1-10. 模型案例,路由和內存存儲

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 List<Book> List = new List<Book>     {
         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 所示,這段代碼是為了創建一個從 Web API MVC Controller 的鏈接。BooksPageController 負責處理書籍。為了生成鏈接,我們可以調用 UrlHelper 的鏈接方法,然后傳相關路由的值。

 

清單 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。在這樣的情況下,使用一個 MVC 特定的方法-UrlHelper,他是由 HttpRouteUrl 擴展的方法。

 

清單 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);
    }
}

 

 

 

 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德格县| 丰宁| 云浮市| 镇沅| 贞丰县| 兴仁县| 金堂县| 恩平市| 宁远县| 苍南县| 乌海市| 腾冲县| 二连浩特市| 太保市| 沂南县| 武威市| 阜宁县| 竹溪县| 温宿县| 绩溪县| 龙门县| 舟曲县| 大兴区| 通化市| 竹山县| 长葛市| 湖北省| 登封市| 长汀县| 凤阳县| 鄂尔多斯市| 汝阳县| 深州市| 巩留县| 永安市| 海安县| 昌江| 阿坝县| 偃师市| 青海省| 龙游县|