(译)ASP.NET MVC Routing 概述

2023-05-16

ASP.NET MVC Routing 概述

在本篇教程中,你将会了解到 ASP.NET MVC 中一个重要的组件。这个组件叫做 ASP.NET Routing,它负责将客户端请求的路径映射到特定的一个类(Controller)的一个函数(Action)。并且在教程的结尾,你将会掌握一个标准路由是如何映射到特定类的特定函数。

使用默认的路由表

当你创建一个新的 ASP.NET MVC 应用程序的时候,就已经默认地在两个地方配置了 ASP.NET Routing

首先,你可以在应用程序的配置文件(Web.config)找到与 ASP.NET Routing 有关的配置。这些节点如下所示:

l  system.web.httpModules

l  system.web.httpHandlers

l  system.webserver.modules

l  system.webserver.handlers section

在没有了解他们之前,请不要随意的更改或删除他们,否则可能导致你的应用程序或 ASP.NET Routing无法正常的工作。

其次更为重要的是,一张路由表是在全局文件(Global.asax)中创建的。这个特殊文件包含了ASP.NET 应用程序生命周期以及一些HTTP处理的事件。例如我们关注的路由表就是在 Application_Start事件中创建的。

Listing 1 – ~/Global.asax.cs

using System.Web.Mvc;

using System.Web.Routing;

namespace MVCTestDemo

{

    public class MvcApplication : System.Web.HttpApplication

    {

        public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(

                "Default",                                              // 路由名

                "{controller}/{action}/{id}",                           // URL参数

                new { controller = "Home", action = "Index", id = ""// 默认值

            );

        }

        protected void Application_Start()

        {

            RegisterRoutes(RouteTable.Routes);

        }

    }


}  

当你的 ASPNET MVC应用程序首次启动的时,Application_Start()将会被系统自动调用。这个函数调用了一个静态函数RegisterRoutes(),从代码中可以看出,这个函数创建了一个路由表

让我们来分析下 RegisterRoutes() 函数,这个函数包含了一个名为 Default 的路由器,这个路由器映射的第一部分是 Url Controller 名称。第二个部分将指示要访问这个 Controller下的哪一个 Action。而最后一个 id,则是指示要传递给 Action 的参数。

想像一下,当你在浏览器中键入如下所示的 URL 地址(除了主机和端口):

/Home/Index/3

聪明的你可能已经看出,这样的地址意味着如下:

controller = Home

action = Index

id = 3

没错,参照上面的代码,当你请求这样的URL时,就是这样的“解释”的。更深一步,这样的URL地址,就像是客户端调用了这样的函数。

HomeController.Index(3)

当然,这样只是一个示例。准确的说,前面的HomeController是一个我们定义的类,这个类包含一个Index( int id ) 函数。当运行的时候,ASP.NET MVC将会实例化一个HomeController,从而调用,并传递参数。

再来尝试一下,当你在请求这样的地址呢?

/Home

很显然,你并没有给予系统Actionid部分。这个时候,我们回顾下上面的Listing 1的代码清单。是的,很清晰的告诉系统:

l  当没有Controller时,将这个部分默认Home

l  当没有Action时,将这个部分默认Index

l  最后,当没有给定id时,将会默认一个空的字符串。

如果你没有理解这个部分,你参考下Listing 2的代码。

Listing 2 – ~/Controllers/HomeController.cs

using System.Web.Mvc;

namespace MVCTestDemo.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        public ActionResult Index(string id)

        {

            return View();

        }

    }


}  

代码 Listing 2 部分,便是ASP.NET MVC C C,就是ControllerASP.NET 的命名规则就是NameController

请求 /Home/Index/3 这样的 URL ,则调用的是 HomeController.Index( 3 )

同理,倘若请求 /Test/About/3,自然调用的是TestController.About(3)

不过,当你请求 /Home/Index/3 时,不一定要对这个参数3“负责”。你可以完全无视参数。Listing 3 可以清晰的表示。对于非ControllerAction的部分,你可以选择“爱理不理”。

Listing 3 – ~/Controllers/HomeController.cs

using System.Web.Mvc;

namespace MVCTestDemo.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        public ActionResult Index()

        {

            return View();

        }

    }


}  

根据我们注册的路由表,可以得知:在默认的情况下,当我们请求/Home路径的时候,视同调用了这样的函数(当参数为string数据类型时,参考代码Listing 2):

HomeController.Index(String.Empty)

当然,从字面上可以理解配置的参数(id)明显是一个整型。你完全可以选择使用int来作为数据类型。但是请注意,我们所配置的是一个默认为空字符串的id,如果你仅仅使用整型,将会抛出异常(无法将null转换为Int32),你完全可以使用可空类型(int?)。

转载于:https://www.cnblogs.com/sofire/articles/1603541.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(译)ASP.NET MVC Routing 概述 的相关文章

  • VS 2010、NUNit 和“当前不会命中断点。尚未为此文档加载任何符号”

    使用 Windows 7 32 位 VS 2010 NET 4 DLL NUnit 2 5 5 对应用程序进行单元测试 我目前收到以下错误 看了很多帖子并尝试了以下方法 重启机器 重启VS 删除 bin obj 并重新加载 清理 重建 但我
  • WPF - 检测鼠标按下一段时间

    检测鼠标按钮何时在特定元素上按住特定时间段的最佳方法是什么 感谢您的提示 我创建了一个附加属性以避免任何代码隐藏 using System using System Windows using System Windows Threadin
  • 在 Windows 窗体应用程序 (.net) 中单击图像的 X/Y 坐标

    有没有办法知道在 FORMS 应用程序中单击了哪些 x y 坐标 看看鼠标事件参数 http msdn microsoft com en us library system windows input mouseeventargs memb
  • 转换BitmapImage后内存未释放

    我遇到以下 C 测试 代码的问题 public static void TestBitmap2ByteArray BitmapImage bitmap JpegBitmapEncoder encoder new JpegBitmapEnco
  • 将 .NET P/Invoke 代码组织为 Win32 API 的最佳实践

    我正在 NET 中重构一个大型且复杂的代码库 该代码库大量使用 P Invoke to Win32 API 该项目的结构不是最好的 我发现 DllImport 语句遍布各处 经常为同一函数重复 并且还以多种方式声明 导入指令和方法有时声明为
  • int -> int list 与类型 int -> IEnumerable<'a> 不兼容

    Given open System Linq 这是一个可以接受的表达方式 2 3 4 SelectMany fun n gt 1 n 但这不是 2 3 4 SelectMany fun n gt 1 n 错误消息显示 int gt int
  • 使用 F5 时,finally 似乎没有在 C# 控制台应用程序中执行

    int i 0 try int j 10 i catch IOException e finally Console WriteLine In finally Console ReadLine 在VS2008中按F5时 finally块似乎
  • 如何在不发送电子邮件的情况下检查 smtp 服务器? [复制]

    这个问题在这里已经有答案了 我有一个 Web 应用程序 用户可以设置 SMTP 服务器信息 服务器 主机 SMTP 端口 用户名 密码 电子邮件地址 使用的 SSL 当用户设置信息时我需要验证服务器而不发送电子邮件并检查smtp信息是否有效
  • Visual Studio 2022 - 编译旧应用程序时出错

    我们正在尝试在 Visual Studio 2022 中使用 VB6 32 位应用程序 编译 2002 年以来非常旧的应用程序 我们需要调试此应用程序并能够在 Windows 10 计算机上运行此应用程序 编译时 我们发现以下错误 这似乎是
  • C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

    我已经设置了一个 SerialDataReceivedEventHandler 并在 VS2008 Express 中使用基于表单的程序 我的串口设置如下 115200 8N1 Dtr 和 Rts 已启用 接收字节阈值 1 我有一个通过蓝牙
  • 并行应用程序的可变与不可变[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我正在编写的应用程序中 我需要编写大量基本类型 这些类型很可能是不可变的 但我想知道并行应用程序中可变类型与不可变类型的比较如何 您可以对可变
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 同一服务器上的多个.NET版本

    所以我一直都知道在一台计算机 客户端或服务器 上运行多个版本的 NET 框架是可以的 这个问题 https stackoverflow com questions 407306 running many versions of net on
  • 在 C# 中使用通配符解析相对路径

    在 C 中 如果我有一个目录路径和一个带通配符的相对文件路径 例如 c foo bar and blah cpp 有没有一种简单的方法来获取绝对文件路径列表 例如 c foo blah a cpp c foo blah b cpp 背景 有
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e
  • c#.NET 和 sprintf 语法

    这段代码如何翻译成 C 具体来说是如何sprintf用C 实现 string output The user s logged in string loggedIn is string loggedOut isn t if TheUser
  • “你好世界!!”在 .NET 4 中生成 3500 个页面错误

    我正在运行 Windows Vista 和 Visual Studio 2010 使用 NET 4 2 GB RAM 和大约 800 MB 可用空间 我创建了一个 Windows 窗体应用程序 但没有向其中添加任何代码 只需在发布模式下编译
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • download excel file from datagrid for webpage

    lt summary gt Summary description for WebExcelUtil lt summary gt public sealed class WebExcelUtil public static void Gen
  • C#:装箱和拆箱

    C 允许 值类型 的任何值与 Object 类型的值相互转换 装箱是将值类型转换为引用类型 xff1b 拆箱是将引用类型转换为值类型 xff1b int i 61 100 object o 61 i 装箱 xff1a 将值类型i转化为了ob
  • 漂亮的登陆框

    转载于 https www cnblogs com aspphpvbs archive 2013 04 20 3033057 html
  • IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中 xff0c 分别介绍了简单工厂模式 和工厂方法模式 xff0c 我们知道简单工厂模式 的优点是去除了客户端与具体产品的依赖 xff0c 缺点是违反了 开放 关闭原则 xff1b 工厂方法模式 克服了简单工厂模式 的缺点
  • 软件工程小组第八次会议记录

    会议主题 xff1a 确定各个接口的命名及功能 与会时间 xff1a 6月17日 与会地点 xff1a 逸夫楼C202 与会成员 xff1a 尚卓燃 张世豪 傅宇豪 王昊钰 会议记录 xff1a 前端与后端讨论了接口的命名和功能 xff0c
  • Ant入门教程

    本内容包含了Ant的历史简要介绍 xff0c Ant的功能以及Ant框架的介绍 xff0c 并对下载安装使用Ant进行了示例介绍 xff0c 同时通过一个Java程序讲解了Ant的基本使用方法 1 Ant简介 xff1a 这里引用Ant帮助
  • Python 与系统管理

    作为一名系统管理员 xff0c 您可能碰到过各种各样的挑战和问题 管理用户 磁盘空间 进程 设备和备份 xff0c 可能让许多系统管理员绞尽脑汁 xff0c 从而变得心情郁闷 甚至精神错乱 Shell 脚本可以为此提供帮助 xff0c 但是
  • Nuget控制台 - 给你的快速添加缺少的包

    利用命令行安装包 转载于 https www cnblogs com davidgu p 3250663 html
  • Swift语言精要 - Operator(运算符重载)

    运算符重载 Swift的这一语言特性或许应该启发于C 43 43 class Vector2D var x Float 61 0 0 var y Float 61 0 0 init x Float y Float self x 61 x s
  • 关于研究性和工程性

    自己将要往哪个方向发展呢 xff1f 最近一段时间很认真的考虑了一下周围的人 xff0c 有做工程的 xff0c 有做研究的 xff0c 还有做商务的 做工程实际具体 xff0c 相对简单些 xff0c 但是可能薪水也相对低一些 xff1b
  • C#日写点滴(2)

    CTS Common Type System 公共类型系统 C 认可的基本预定义类型并没有内置于C 语言中 xff0c 而是内置于 NET Framework中 例如 xff0c 在C 中声明一个int类型的数据时 xff0c 声明实际上是
  • SQL-关联查询【转】

    T A A表 T B B标 xff0c id为表与表相关联的字段 96 创建相关表结构 span class hljs keyword CREATE span class hljs keyword TABLE Table B span cl
  • char, varchar, nchar, nvarchar (Transact-SQL)

    char 和 varchar Transact SQL 长度固定或可变的字符串数据类型 char n 固定长度 xff0c 非 Unicode 字符串数据 n 用于定义字符串长度 xff0c 并且它必须为 1 到 8 000 之间的值 存储
  • .net中类(class)与结构(struct)的不同

    Class可以被实例化 属于引用类 型 是分配在内存的堆上的 类是引用传递的 Struct属于值类型 是分配在内存的栈上的 结构体是复制传递的 Int32 Boolean等都属于结构体 转载于 https www cnblogs com b
  • Intro to asp.net MVC 简单的小程序(2)

    我们做的很简单 xff0c 就是一个电影的表单 xff0c 显示还有创建 强大的封装真的很好用 xff0c 当我们新建的视图的时候 xff0c 强类型下面都有封装好的 Create List Details 很多 xff0c 我们只要选择一
  • 利用网站上传漏洞使用一句话木马控制服务器

    一句话木马 常用于php asp aspx php lt php echo shell exec GET 39 cmd 39 gt asp lt execute request 34 value 34 gt aspx lt 64 Page
  • 用MotoMidMan给L7批量安装java程序

    在给手机装完驱动后 可以通过MotoMidMan给手机内存安装java程序 需要资源 数据线 MotoMidMan java程序 由一个 jar文件与一个 jad文件组成 操作步骤 1 下载完的是个压缩包 扩展名为 rar 解压完的文件清单
  • 28. Implement strStr()

    public class Solution public int strStr String haystack String needle int next 61 new int needle length generateNextArra
  • Oracle数据库删除了数据如何恢复

    再操作数据库时 xff0c 有时候误删了数据或者更新数据时忘记设置更新条件 xff0c 要是这时候没有提交事务 xff0c 还可以执行回滚操作 要是这时候不小心提交了 xff0c 数据也是可以恢复的 我们只需要执行下面这句sql selec
  • (译)ASP.NET MVC Routing 概述

    ASP NET MVC Routing 概述 在本篇教程中 xff0c 你将会了解到 ASP NET MVC 中一个重要的组件 这个组件叫做 ASP NET Routing xff0c 它负责将客户端请求的路径映射到特定的一个类 Contr