ASP.NET MVC轻教程 Step By Step 8——路由
在前面的教程里,细心的你可能会有个疑问,就是地址栏输入/Home/Write就可以进入留言页面。无论是静态HTML还是ASP/ASP.NET、PHP,URL都是和某个页面相关。比如假设有个URL是“www.xxx.com/index.aspx?id=1",浏览器请求的页面是index.aspx,同时带有名为id值为1的参数。那为什么输入/Home/Write可以进入留言页面?你可能会认为其中Write是与write.cshtml对应,其实不然,动作方法名与视图名相同是约定,并不是铁律,我们完全可以在Wirte动作方法中指定渲染其他名称的视图。如下代码所示。
public ActionResult Write()
{
return View("Write2");
}
修改后,Write方法将指定视图”Wirte2“显示。可见和URL相关联的并非视图而是控制器,实际上响应用户URL输入正是Controller的主要任务。问题是是什么使得URL与Controller联系到一起的,答案是路由机制。
Step 1. 认识路由
在解决方案资源管理器App_Start目录下的RouteConfig.cs文件保存着路由配置。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
RouteConfig类包含静态方法RegisterRoutes,MapRoute方法定义了路由规则,它包含三个参数:name指明了路由规则的名称,如果添加了多条路由规则,其名不可重复;url定义了地址的样式;defaults指定路由默认值。其中{controller}的默认值是Home,{action}的默认值是Index,而id是可选项。当运行程序时,默认的控制器是Home,默认的动作方法是Index,所以即使我们并没有输入/Home/Index执行的也是HomeController的Index方法。当我们输入/Home/Write时,匹配的controller是Home,action是Write,而id因为是可选的,所以没有也没关系。这样Url就和控制器对应了。
Step 2. 生成超链接
路由机制是双向的,不光可以从Url得到执行的Controller和Action,也可以由Controller和Action生成Url。在Index视图我们需要添加链接到留言页面的超链接,传统做法是使用<a>标签。
<body>
<h1>MVC留言板</h1>
<a href="/Home/Write">我要留言</a>
@foreach (var message in Model)
{
<p>@message.NickName</p>
<p>@message.Content</p>
<p>@message.ReleaseDate</p>
<br />
}
</body>
现在我们可以使用HTML辅助方法来生成超链接。
<body>
<h1>MVC留言板</h1>
@Html.ActionLink("我要留言","Write")
@foreach (var message in Model)
{
<p>@message.NickName</p>
<p>@message.Content</p>
<p>@message.ReleaseDate</p>
<br />
}
</body>
使用Html.ActionLink方法通过Write动作方法名来生成与前者一致的<a>标签,这里没有指明控制器名是因为Index与Write同属于HomeController,如果不是同一个控制器,那就再添加一个控制器名称的参数。
页面显示如下。

路由是ASP.NET MVC非常重要又棘手的内容,特别是与我们原有的ASP/ASP.NET、PHP的经验有很大的差异,值得去深入挖掘思考。现在只是初步了解,接下来我们还会不断地和它打交道。
ASP.NET MVC轻教程 Step By Step 8——路由的更多相关文章
- ASP.NET MVC轻教程 Step By Step 6——改进表单
上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单. Step 1. 修改Form标签 首先,我们可以使用Html.B ...
- ASP.NET MVC轻教程 Step By Step 1 ——入门
使用ASP.NET MVC有一段时间了,本人还是非常喜欢ASP.NET MVC这个框架模式的.在经历了WebForm复杂粗暴的做法后,自然感觉简洁优雅的MVC清新可人,只不过WebForm和MVC的设 ...
- ASP.NET MVC轻教程 Step By Step 13——页面布局
一般在一个网站中页面会使用相同的结构和元素,如果每个页面都要重复添加这些元素,不仅繁琐更会给我们后期维护带来大麻烦.所以我们采用网页模板之类的技术,将固定不变的元素放入模板,同时留下一些占位符供页面各 ...
- ASP.NET MVC轻教程 Step By Step 12——客户端验证
前面两节使用的两种数据验证方法都是在服务器端进行的,也就是提交了表单,数据回传给服务器才能验证.这样会带来两个问题,一是用户体验不好,用户提交了表单之后才知道存在问题:二是会给服务器带来额外的压力.我 ...
- ASP.NET MVC轻教程 Step By Step 9——分页
现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...
- ASP.NET MVC轻教程 Step By Step 7——改进Write动作方法
在上一节我们使用强类型视图改进Write视图获得更好的智能感知和代码重构,现在可以进一步的改进动作方法. Step 1. 数据模型绑定 在Save方法中我们使用Request来获取表单传送的值,其实可 ...
- ASP.NET MVC轻教程 Step By Step 2 ——View初探
在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...
- ASP.NET MVC轻教程 Step By Step 4——Model、View和Controller
ASP.NET MVC中的Model(数据模型)主要包括定义数据结构.数据库读写.数据验证等等和对象处理相关的工作. 在解决方案资源管理器中找到Model文件夹,点击右键,添加一个新类,名为“Mess ...
- ASP.NET MVC轻教程 Step By Step 5——初识表单
上一节我们将留言列表显示在Index视图里了,现在该添加一个留言的表单,好让用户自己添加留言. 首先在HomeController中添加一个名为“Write”的动作方法. public ActionR ...
随机推荐
- 20169210《Linux内核原理与分析》第七周作业
第一部分:实验 首先还是网易云课堂的实验内容,扒开系统调用的三层皮(下),分为两部分: 1.给MenuOS增加time和time-asm命令 2.系统调用在内核代码中的处理过程 给MenuOS增加ti ...
- soap实例入门(转)
SOAP的HelloWord实例- - 1.1 前言 2005-3-2公司开会并分给我一个任务:写一个程序从福建移动的BOSS系统取出一些相关数据.我得到的资料仅仅有一个“福建移动BOSS与业务增值 ...
- oracle15 pl/sql 分页
PL/SQL分页 编写分页过程 无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程: ...
- C#生成XML的三种途径
C#生成XML的三种途径 为了全面,这里都将XML保存到文件中,有三种生成XML的方式: 1.我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocu ...
- java List排序方法 Comparator和Comparable
今天写的一个程序中需要对一个List进行排序,突然发现自己对这个问题一无所知,于是查阅资料并进行测试,在此做个记录. Collections工具类中有两个方法可以对List进行排序,分别为: publ ...
- Android 解决调用系统相册打不开图片 DecodeServices报解码错误
这是由于系统相册不知道你图片目录是一个相册.打开前需要向系统相册“注册一下”,说白了就是让系统相册知道你这个图片所在的文件夹是个相册. private static void scanImageFil ...
- Migration of ASP.NET app from IIS6 to IIS7 (7.5)
For many of us familiar problem. You developing applications under IIS6 and you're about to move the ...
- Python获取web页面信息
import sys, urllib2 # req = urllib2.Request(sys.argv[1]) req = urllib2.Request('http://www.sina.com. ...
- JavaScript的DOM操作(一)
DOM:文档对象模型 --树模型文档:标签文档,对象:文档中每个元素对象,模型:抽象化的东西 一:window: 属性(值或者子对象):opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器 ...
- Winedt 7.0 Build: 20120321 永久试用方法 WinEdt 7.0 破解
该方法,不是破解. 因为WinEdt试用版与正式版功能无异. 所以,该方法是 通过更新注册表信息,重置安装时间. 也就是重新获取31天的试用期时长. 方法如下: 1.用管理员权限打开CMD. 2.运行 ...