MVC有关的核心命名空间

本文详细介绍了ASP.NET MVC框架中的核心命名空间,包括System.Web.Routing、System.Web.Mvc等,以及MVC应用程序的目录结构和路由机制。通过理解这些关键概念,可以帮助开发者更好地构建和管理MVC Web应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVC有关的核心命名空间主要有以下几个

1) System.Web.Routing

URL路由在该命名空间下提供了使用URL路由功能的类,它可以将一个URL路由映射对应到Controller上,而不是映射到一个物理文件。

2) System.Web.Extensions

这是ASP.NET Ajax的命名空间,在MVC中使用Ajax功能时需要引用。

3) System.Web.Mvc

这是ASP.NET MVC最主要的命名空间。该命名空间包含一些类和接口,它们支持用于创建Web应用程序的ASP.NET MVC框架。该命名空间包含表示控制器、控制器工厂、操作结果、视图、分部视图以及模型编译等的类。

4) System.Web.Abstractions

该命名空间包含一些相关的基类,例如HttpContextBase和HttpRequestBase等。

5) System.Web.DynamicData

该命名空间包含为 ASP.NET 动态数据提供核心功能的类。另外,它还提供允许自定义动态数据行为的扩展性功能。

创建ASP.NET MVC Web应用程序项目时,MVC组件会按项目文件夹自动分开,如图1-4所示。

 

 
图1-4  MVC应用程序目录结构

默认情况下,MVC应用程序目录结构包括以下文件夹。

引用  包含项目运行所需的命名空间与程序集,在上一节中介绍过。

App_Data  这是数据的物理存储区。此文件夹的作用与它在使用WebForm页面的ASP.NET网站中的作用相同。

Content  建议在此位置添加内容文件,如级联样式表文件、图像等。通常,Content文件夹用于存储静态文件。

Controllers  建议在此位置存储控制器。MVC 框架要求所有控制器的名称均以Controller结尾,如HomeController、LoginController或ProductController。

Models  这是为表示 MVC Web应用程序的应用程序模型的类提供的文件夹。此文件夹通常包括定义对象以及定义与数据存储交互所用的逻辑的代码。通常,实际模型对象将位于单独的类库中。但是在创建新应用程序时,可以将类放在此处,然后在开发周期中稍后的某个时刻将其移动到单独的类库中。

Scripts  建议在此位置存储支持应用程序的脚本文件。默认情况下,此文件夹包含 ASP.NET Ajax 基础文件和 jQuery 库。

Views  建议在此位置存储视图。视图使用ViewPage(.aspx)、ViewUserControl(.ascx) 和ViewMasterPage(.master) 文件,以及与呈现视图相关的任何其他文件。在Views文件夹中,每个控制器都具有一个文件夹,该文件夹以控制器名称前缀命名。例如,如果控制器名为HomeController,则Views文件夹包含名为Home的子文件夹。

默认情况下,当ASP.NET MVC框架加载视图时,它将在"Views\控制器名称"文件夹中寻找具有请求的视图名称的ViewPage (.aspx)文件。默认情况下,Views文件夹中也有一个名为Shared的子文件夹,但该文件夹不与任何控制器对应。

Shared文件夹用于存储在多个控制器之间共享的视图。例如,我们可以将Web应用程序的母版页放在Shared文件夹中。

 

除了使用前面列出的文件夹之外,ASP.NET MVC Web应用程序还使用Global.asax文件中的代码来设置全局URL路由默认值,并且使用Web.config文件来配置应用程序。

路由在Global.asax文件的Application_Start方法中初始化

默认的路由表中包含一个路由,该默认路由将所有进入的请求拆分为3个单元(URL 单元是正斜杠之间的所有内容)。第一个单元映射到控制器名称,第二个单元映射到操作名称,最后一个单元映射到传递给操作名称 ID 的参数。

 

例如,考虑下面的URL:

 
 
  1. /Product/Details/3  

此URL被解析为如下3个部分:

 
 
  1. Controller ProductController 
  2. Action Details 
  3. Id 3 

前缀控制器将被附加到控制器参数的末端,这只是MVC的一个特殊之处。

默认路由包括所有3个单元的默认值。默认控制器是HomeController,默认操作是Index,而默认ID是一个空字符串。观察这些默认值,考虑如何解析下面的 URL:

 
 
  1. /Employee 

此URL被解析为如下3个参数:

 
 
  1. Controller EmployeeController 
  2. Action Index 
  3. Id “”  

最后,如果打开ASP.NET MVC应用程序而不提供任何URL(例如http://localhost/),那么URL将被解析为:

 
 
  1. Controller HomeController 
  2. Action Index 
  3. Id “”  

在构建传统的ASP.NET WebForm应用程序时,URL和页面是一一对应的。如果从服务器上请求名称为Index.aspx的页面,则硬盘上最好有名称为Index.aspx的页面。如果Index.aspx文件不存在,则将出现404 - Page Not Found错误。

相反,在构建ASP.NET MVC应用程序时,在浏览器地址栏中键入的URL和应用程序中的文件不存在对应关系。在ASP.NET MVC应用程序中,URL对应的是控制器操作,而不是硬盘上的页面。

还有,在传统的ASP.NET应用程序中,浏览器请求是映射到页面上的。在ASP.NET MVC应用程序中,浏览器请求是映射到控制器操作。ASP.NET WebForm应用程序关注的是内容,而ASP.NET MVC应用程序关注的则是应用程序逻辑。

 

视图

由HomeController类中公开的两个控制器方法Index()和About()都返回一个视图。视图包括发送到浏览器的HTML标记和内容。在使用ASP.NET MVC应用程序时,视图等于页面。

因此,必须在正确的位置创建视图。HomeController.Index()操作返回位于以下路径的视图:

 
  
  1. \Views\Home\Index.aspx 

HomeController.About()操作返回位于以下路径的视图:

 
  
  1. \Views\Home\About.aspx 

总之,如果要为控制器操作返回视图,则需要在Views文件夹中使用与控制器相同的名称创建子文件夹。在子文件夹中,必须创建与控制器操作名称相同的.aspx文件。

视图非常类似于ASP.NET WebForm的页面,视图包括HTML内容和脚本,可以使用我们熟悉的.NET编程语言(如C#或Visual Basic .NET)来编写脚本。可以使用脚本显示动态内容,例如数据库中的数据。

模型

MVC模型包含所有视图或控制器不包含的应用程序逻辑。模型应该包含所有应用程序业务逻辑和数据库访问逻辑。例如,如果正在使用 LINQ to SQL 访问数据库,那么将在Models文件夹中创建LINQ to SQL类(dbml文件)。

视图应该只包含与生成用户界面相关的逻辑。控制器应该只包含要求返回正确视图或者将用户重定向到另一操作所需的最小逻辑,其他所有内容都应包含在模型中。总之,应该努力实现高效模型和简化控制器。控制器方法应该只包含几行代码。如果控制器操作过长,则应该考虑将逻辑移动到Models文件夹下的一个新类中。

ASP.NET MVC与WebForm相比,最大的优势就是当应用程序日益复杂时,可以通过分离模型、视图和控制器来进行单元测试。从而使开发者更容易、及时地发现问题。

 一般的URL可以由6部分组成,一般格式如下(带方括号的为可选项):

 
  
  1. protocol :// hostname[:port] [/path] [?parameters][#fragment] 

URL各部分的说明如下。

protocol  协议。可以是HTTP(超文本传输协议)、FTP(文件传输协议)和HTTPS(安全的超文本传输协议)等。

hostname  主机名。指在互联网中存放资源的服务器DNS主机名或IP地址。

port  端口号。该选项是一个小于66 536的正整数,是各服务器或协议约定的通信端口。

path  路径。一般用来表示一个Web站点中的目录或文件资源的地址。

parameters  参数列表。可以给使用动态网页技术(如PHP、ASP、ASP.NET和JSP等)制作的网页传递参数。参数形式为以等号=隔开的键/值对,多个参数之间用And符号&连接。

fragment  信息片断。可以直接定位到页面中的某个锚点标记。

自定义URLRouting规则。

首先,先预计我的博客需要有以下几种URL格式。

Blog.mvc/2010-11-07  使用该URL可以在博客中查询系统中某个日期的所有动态信息。例如博客文章、图片等。

Photo/life.private  使用该URL在相册中相询关键字为life,访问权限为private(私有)的照片。

Photo/2010/work  使用该URL查询某年内关于work的信息。

Article/Show/aspnet  使用该URL可以访问文章列表,其中关键字为aspnet。

Home/Index/32  使用该URL访问指定关键字的内容。这里的关键字为整型数值。

了解过了需求,下面着手编写路由代码。为了节省篇幅,这里直接贴出所有配置代码,如下所示:

 
  
  1. // Blog.mvc/2010-11-07  
  2. routes.MapRoute(  
  3.     "BlogRoute",  
  4.     "Blog.mvc/{date}",  
  5.     new controller "Blog"action "List" },  
  6.     new date @"^\d{4}-\d{2}-\d{2}" });  
  7.  
  8. // Photo/life.private  
  9. routes.MapRoute(  
  10.     "PhotoRoute",  
  11.     "Photo/{make}.{model}",  
  12.     new controller "Picture"action "Show" },  
  13.     new model @"(private|public)" });  
  14.  
  15. // Photo/2010/work  
  16. routes.MapRoute(  
  17.     "PhotoRoute2",  
  18.     "Photo/{*values}",  
  19.     new controller "Photo"action "Index" },  
  20.     null);  
  21.  
  22. // Article/Show/aspnet  
  23. routes.MapRoute(  
  24.     "ArticleRoute",  
  25.     "Article/Show/{key}",  
  26.     new controller "Article"action "List" },  
  27.     new httpMethod "POST" });  
  28.  
  29. // Article/Show/aspnet  
  30. routes.MapRoute(  
  31.     "ArticleRoute2",  
  32.     "Article/Show/{key}",  
  33.     new controller "Article"action "List" },  
  34.     new });  
  35.  
  36. // Home/Index/32  
  37. routes.MapRoute(  
  38.     "Default",  
  39.     "{controller}/{action}/{id}",  
  40.     new controller "Home"action "Index"id "0" },  
  41.     new controller @"^\w+", action @"^\w+", id @"^\d+" }); 
  42. 需要注意的是路由规则中的名称参数不可以重复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值