MVC Controller 链接到 API Controller 以及反向链接

问题

想创建一个从 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. 模型案例,路由和内存存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Book {
     public int Id { getset; }
     public string Author { getset; }
     public string Title { getset; }
     public string Link { getset; }
 }
  
 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

1
2
3
4
5
6
7
8
public class BooksController : ApiController{
    public Book GetById(int id)
    {
        var book = Books.List.FirstOrDefault(x => x.Id == id);
        if (book == nullthrow 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

1
2
3
4
5
6
7
8
9
public class BooksPageController : Controller{
    public ActionResult Details(int id)
    {
        var book = Books.List.FirstOrDefault(x => x.Id == id);
        if (book == nullreturn new HttpNotFoundResult();
        book.Link = Url.HttpRouteUrl("DefaultApi"new {controller = "Books", id});
        return View(book);
    }
}

博客园http://www.cnblogs.com/shuizhucode/

51 CTOhttp://shuizhucode.blog.51cto.com/

MVC Controller 链接到 API Controller 以及反向链接的更多相关文章

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

    问题 想创建一个从 ASP.NET MVC controller 到 ASP.NET Web API controller 的直接链接,或者反向链接. 解决方案 可以使用 System.Web.Htt ...

  2. MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作

    MVC模式(Model View Controller): Model:DAO模型 View:JSP  在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...

  3. ASP.NET Core开发-MVC 使用dotnet 命令创建Controller和View

    使用dotnet 命令在ASP.NET Core MVC 中创建Controller和View,之前讲解过使用yo 来创建Controller和View. 下面来了解dotnet 命令来创建Contr ...

  4. [译] ASP.NET MVC 6 attribute routing – the [controller] and [action] tokens

    原文:http://www.strathweb.com/2015/01/asp-net-mvc-6-attribute-routing-controller-action-tokens/ 当在Web ...

  5. Core开发-MVC 使用dotnet 命令创建Controller和View

    NET Core开发-MVC 使用dotnet 命令创建Controller和View   使用dotnet 命令在ASP.NET Core MVC 中创建Controller和View,之前讲解过使 ...

  6. 测试 ASP.NET Core API Controller

    本文需要您了解ASP.NET Core MVC/Web API, xUnit以及Moq相关知识. 这里有xUnit和Moq的介绍: https://www.cnblogs.com/cgzl/p/917 ...

  7. [ASP.NET MVC 小牛之路]09 - Controller 和 Action (1)

    我们知道,在 MVC 中每个请求都会提交到 Controller 进行处理.Controller 是和请求密切相关的,它包含了对请求的逻辑处理,能对 Model 进行操作并选择 View 呈现给用户, ...

  8. [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)

    继上一篇文章之后,本文将介绍 Controller 和 Action 的一些较高级特性,包括 Controller Factory.Action Invoker 和异步 Controller 等内容. ...

  9. 创建ASP.NET Core MVC应用程序(1)-添加Controller和View

    创建ASP.NET Core MVC应用程序(1)-添加Controller和View 参考文档:Getting started with ASP.NET Core MVC and Visual St ...

随机推荐

  1. Java 单测 回滚

    Java 在单测的时候 需要做回滚 设置如下: 需要添加以下 注解 在类上 defaultRollback = true : 为 默认全部回滚 defaultRollback = false : 为 ...

  2. Something wrong with FTK's index search results

    My friend she told me last week that FTK could not "see" keywords in a plain text files wh ...

  3. windows服务访问网络资源(局域网内共享的文件夹)

    参考: 1.http://www.cnblogs.com/jak-black/articles/windows.html 2.http://q.cnblogs.com/q/25391/ 网络映射 1. ...

  4. ftp自动上传下载文件脚本

    FTP自动登录批量下载文件 从ftp服务器192.168.1.60 上的/home/data 到本地的/home/databackup目录 #!/bin/bash ftp -v -n 192.168. ...

  5. 码农谷 球从M米高度自由下落第N次落地时反弹的高度

    题目描述 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下.它在第N次落地时反弹多高?共经过多少米? 保留两位小数. 输入描述 M N 输出描述 它在第N次落地时反弹多高?共经过多少米? 保 ...

  6. javaSE第十六天

    第十六天    140 1:List的子类(掌握)    140 (1)List的子类特点    140 (2)ArrayList    141 A:没有特有功能需要学习    141 B:案例    ...

  7. CICS的database中R D中参数的含义

    见链接 http://blog.163.com/ajj_star/blog/static/1626772542010328113513429/ Region Definitions (RD) 定义了所 ...

  8. 双人对战的球类游戏IOS源码

    双人对战的球类游戏源码,这个是一款双人对战的ios球类游戏源码,游戏的源码也比较详细的,我们在屏幕上下看到各有一个球门,内有一球,两边通过控制轮盘使球进入对方的球门的,其实玩法也很简单的,我们知道体育 ...

  9. ASP.NET MVC5 入门

    参考资料<ASP.NET MVC5 高级编程>第5版 第1章 入门 1.1 ASP.NET MVC 简介 ASP.NET MVC是一种构建Web 应用程序的框架,它将一般的MVC(Mode ...

  10. linux常用命令--ps、netstat、find

     一.ps 1.1ps命令简介 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那 ...