在前面的教程里,细心的你可能会有个疑问,就是地址栏输入/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——路由的更多相关文章

  1. ASP.NET MVC轻教程 Step By Step 6——改进表单

    上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单. Step 1. 修改Form标签 首先,我们可以使用Html.B ...

  2. ASP.NET MVC轻教程 Step By Step 1 ——入门

    使用ASP.NET MVC有一段时间了,本人还是非常喜欢ASP.NET MVC这个框架模式的.在经历了WebForm复杂粗暴的做法后,自然感觉简洁优雅的MVC清新可人,只不过WebForm和MVC的设 ...

  3. ASP.NET MVC轻教程 Step By Step 13——页面布局

    一般在一个网站中页面会使用相同的结构和元素,如果每个页面都要重复添加这些元素,不仅繁琐更会给我们后期维护带来大麻烦.所以我们采用网页模板之类的技术,将固定不变的元素放入模板,同时留下一些占位符供页面各 ...

  4. ASP.NET MVC轻教程 Step By Step 12——客户端验证

    前面两节使用的两种数据验证方法都是在服务器端进行的,也就是提交了表单,数据回传给服务器才能验证.这样会带来两个问题,一是用户体验不好,用户提交了表单之后才知道存在问题:二是会给服务器带来额外的压力.我 ...

  5. ASP.NET MVC轻教程 Step By Step 9——分页

    现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...

  6. ASP.NET MVC轻教程 Step By Step 7——改进Write动作方法

    在上一节我们使用强类型视图改进Write视图获得更好的智能感知和代码重构,现在可以进一步的改进动作方法. Step 1. 数据模型绑定 在Save方法中我们使用Request来获取表单传送的值,其实可 ...

  7. ASP.NET MVC轻教程 Step By Step 2 ——View初探

    在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...

  8. ASP.NET MVC轻教程 Step By Step 4——Model、View和Controller

    ASP.NET MVC中的Model(数据模型)主要包括定义数据结构.数据库读写.数据验证等等和对象处理相关的工作. 在解决方案资源管理器中找到Model文件夹,点击右键,添加一个新类,名为“Mess ...

  9. ASP.NET MVC轻教程 Step By Step 5——初识表单

    上一节我们将留言列表显示在Index视图里了,现在该添加一个留言的表单,好让用户自己添加留言. 首先在HomeController中添加一个名为“Write”的动作方法. public ActionR ...

随机推荐

  1. Navicat远程连接MySQL数据库

    1.打开Navicat,在界面的“主机名和IP地址”处输入IP地址,一般是192.168.1.1 2.输入相应的用户名和密码,点击连接测试,确认是否已经连接,之后就可以点击确定了 3.找到相应的数据库 ...

  2. Mina学习之IoHandler

    IoHandler处理事件在Filter Chain 之后进行.IoHandler包含处理以下几个事件的功能: 1. sessionCreated event: session创建事件,对于Tcp而言 ...

  3. ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解

    这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉 ...

  4. Android M(6.0) 权限爬坑之旅

    坑一:用Android5.0编译的apk,在Android6.0上运行完全没有问题. 在Android6.0以上才需要在运行时请求权限,在旧Android版本上保留原有逻辑,安装时授予权限. 用旧版本 ...

  5. LRU算法&amp;&amp;LeetCode解题报告

    题目 Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...

  6. WebService学习笔记系列(一)

    webservice主要是解决两个系统或者两个应用程序之间的远程调用,它提供了一种通过web方式访问的api,调用是跨语言.跨平台的. webservice的客户端与服务端进行交互的时候使用xml来传 ...

  7. codeforces 148D Bag of mice(概率dp)

    题意:给你w个白色小鼠和b个黑色小鼠,把他们放到袋子里,princess先取,dragon后取,princess取的时候从剩下的当当中任意取一个,dragon取得时候也是从剩下的时候任取一个,但是取完 ...

  8. Android 5.0 新特性

    Material Design Material Design简介 Material Design是谷歌新的设计语言,谷歌希望寄由此来统一各种平台上的用户体验,Material Design的特点是干 ...

  9. inner join跟where查询的区别

  10. 自己做的demo--左连接

    下面四张表是数据库中已经有的数据: 第一步: 1.left join左连接,left outer join 左外连接,只是写法不同,相同的概念. 2.左连接查出来的结果是一定包含left关键字左边的表 ...