注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Lucifer 的博客

网易英超评论专栏

 
 
 

日志

 
 
 
 

ASP.NET MVC Framework Part 1 (二)  

2008-04-30 05:13:15|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
ASP.NET MVC中默认的URL到控制器类的路由

认的ASP.NET MVC project会预先设置了一组URL名字转换规则,让你无需明确地设置任何东西,进而更容易地入门当你在Visual Studio 里创建的新的ASP.NET MVC project后,里面生成的Global.asax 文件中会自动声明一套默认的URL名字转换规则,这套规则是以名字为基础的,可以立即供你使用。

根据这套默认的名字转换规则,系统会将接受到http request当中的URL路径 (例如: /Products/)映射到一个名字遵循 UrlPathController模式的类(例如: 默认的一个如 /Products/URL会映射到一个名为 ProductsController的类).

为了建立电子商务产品的浏览功能, 我们得往我们得工程里面加入一个名为"ProductsController" 的类 (你可以通过Visual Studio 菜单中的"Add New Item" 来方便地从模板中创建一个控制器类):

image001

我们的ProductsController 类将会继承System.Web.MVC.Controller 这个基类当然从这个基类当中派生并不是必需的- 但是它包含了一套有用的辅助方法和功能能让我们在后面的工作中充分利用:

image002

一旦我们在我们的project里面定义了这个 ProductsController , ASP.NET MVC framework 将会默认地使用它来处理所有的接收到的以"/Products/" 开头的URL.  这意味着它会自动调用这个控制器类来处理诸如"/Products/Categories", "/Products/List/Beverages", 以及 "/Products/Detail/3" 这些我们将会在我们电子商店应用程序中使用到的URL.

在一篇以后的blog 当中我们也会添加一个ShoppingCartController (来使得终端用户能够管理他们的购物车) 和一个 AccountController (使得终端用户能够在网站创建一个新的会员帐户并且登陆或者登出). 一旦我们把这些新的控制器类加入到我们的project, /ShoppingCart/ /Account/ 开头的URL将会自动路由到他们来进行处理。

注意: ASP.NET MVC framework 并不要求你总是使用这套名字转换的模式.  我们的程序当中使用它的唯一理由只是它是一套在我们使用Visual Studio来创建ASP.NET MVC Project后就会默认加入到我们project中的映射规则如果你不喜欢这套规则,或者你想自定义一个不同的URL映射模式,你可以去ASP.NET Application Class (Global.asax)文件当中修改它. 我将会在以后的一篇blog里面告诉你怎么去做 (当我们向你展示一下URL映射引擎的cool的时候).  

 

理解控制器的Action 方法

现在我们就在我们的project里面创建了一个ProductsController,我们现在可以开始在应用程序当中添加逻辑来处理接收到的"/Products/" 这个URL.

就像我们这篇blog开端说的那样,我们打算在这个电子商店网站中实现三种功能: 1) 浏览所有的产品种类, 2) 列出某个特定种类当中的所有产品, 还有3) 显示一个特定产品的详细信息我们将会使用以下的URL来代表这些功能:

URL格式

行为

URL 样例

/Products/Categories

浏览所有的产品种类

/Products/Categories

/Products/List/Category

列出某个特定种类当中的所有产品

/Products/List/Beverages

/Products/Detail/ProductID

显示一个特定产品的详细信息

/Products/Detail/34

 

我们有两种方法,在我们的ProductsController类里面编码去处理这些接收到的URL需求一种方法是通过重写控制器基类里面的 "Execute" 方法然后手动的编写if/else/switching 逻辑结构来分析访问的URL需求然后选定相应的逻辑代码去处理它(类似于javaservlet的做法).

不过还有一种更加简单的方法就是使用MVC Framework内建的特性,我们可以在我们的控制器中定义"action方法" , 然后让控制器基类根据URL路由规则自动地执行相应的action方法.

举个例子, 我们可以在我们的ProductsController类当中添加以下三个控制器action方法(controller action methods)来处理我们上面说的电子商店功能:

image003

在新的project建立的时候就已经预先设定好的URL路由规则将会把URL的子路径按顺序分割,并将分割后的各个字符串分别当作客户端要求访问的控制器名字和action名字来对待所以如果我们收到了一个/Products/CategoriesURL Request, 路由规则将会把"Categories" 当作action的名字, 然后将会执行Categories()方法来处理这个request.  如果我们收到一个/Products/Detail/5URL request , 路由规则将会把"Detail" 当作action的名字, 然后执行Detail()方法来处理这个request. 

注意: ASP.NET MVC framework 不要求你总是使用这种action命名转换模式. 如果你想使用不同的URL映射模式 , ASP.NET Application Class (in Global.asax)文件里面去修改就可以了 .

将URL参数映射到控制器的Action方法

有好几种方法可以在控制器类的action方法里面访问通过URL传递进来的参数.

控制器基类暴露了一组可供使用的RequestResponse object.  这些object拥有和传统ASP.NET中你所熟悉的HttpRequest/HttpResponse object相同的API结构但是一个重要的不同就是现在这些object都是基于接口的而不是基于密封类的(特殊地: MVC framework 集成了新的System.Web.IHttpRequest System.Web.IHttpResponse接口).  使用接口的好处在于非常方便地可以伪造他们- 这能够使控制器类的单元测试更加方便我将会在以后blog当中深入地介绍这些

下面是一个我们在ProductsController类的Detail action方法中如何手动使用Request API去取得ID参数的例子:

image004

ASP.NET MVC framework还支持自动地把URL传递进来的参数映射到action方法在默认情况下,如果你的action方法声明中存在参数, MVC framework 将会在接收到的request 数据中查找是否有一个相应的HTTP request值拥有相同的名字. 如果有, 它会自动的将这个值作为参数传给相应的action方法.

例如, 我们可以重写Detail action方法来充分利用这种支持的好处,如下:

image005

除了可以从requestquerystring/form 集合中映射参数值外,ASP.NET MVC framework 还允许你改变MVC URL路由映射的内部结构在核心URL内部嵌入你的参数值(比如: 你可以使用/Products/Detail/3来取代/Products/Detail?id=3 ). 

当你新建一个MVC项目时候默认的路由映射规则是以"/[controller]/[action]/[id]"格式声明的这意味着如果URL中按顺序除去控制器名字和action方法名字之后还有URL子路径的时候, 这个子路径将会被默认的当作名为"id" 的参数对待- 这同样意味这它能够作为方法所声明的参数传入我们控制器的action方法.

这也意味着我们现在可以让我们自己的Detail 方法自动从URL取得ID参数 (e.g: /Products/Detail/3):

image006

我可以在list action方法中使用我所熟悉的方式,这样的话我就能够把种类的名字作为URL的一部分传递进来 (例如: /Products/List/Beverages).  出于让代码可读性更高的目的, 我将会在这个action中使用"category"来代替"id".

下面是ProductsController类的一个实现完整URL路由和参数映射支持的版本:

image007

注意上面List action 是如何把category 参数作为URL的一部分, 然后将一个可选的页面索引作为querystring (我们在实现服务器端的分页并使用这个值来表示当前request要求显示哪一页的category数据). 

我们MVC framework 中可选的参数将会在控制器action方法中使用nullable类型的参数声明因为我们List action方法中页面参数是nullable int类型的(这就是"int?"的含义), MVC framework将在URL当中存在这一参数的时候将它传进来,而不存在的时候就会传一个null进来你可以看看我另外一个blog去学习如何使用nullable类型(here 

  评论这张
 
阅读(441)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018