[水煮ASP.NETWebAPI2方法论](1-4)从MVCController链接到APIController以及反向链接

问题

在常熟等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、网站设计 网站设计制作按需策划设计,公司网站建设,企业网站建设,高端网站设计,成都全网营销,外贸网站制作,常熟网站建设费用合理。

  想创建一个从 ASP.NET MVCcontroller到 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.NETWeb 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 List = 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所示,这段代码是为了创建一个从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);
    }
}

 

 

 

 


分享标题:[水煮ASP.NETWebAPI2方法论](1-4)从MVCController链接到APIController以及反向链接
文章URL:http://myzitong.com/article/pspisg.html