MVC5知识点记录

最近研究了一下MVC,因为平时使用WebForm比较多,但是现在流行MVC,也是进行了研究。

同样是,学习一个模块,然后在看的时候,写学习笔记。那么接下来,正文开始。

MVC项目条目摘要

App_Data  用于放置私有数据,如数据库文件等。

App_Start  包含路由和过滤器的定义,项目的核心配置。

Areas  区域是把一个大型程序划分成较小的片段方法

bin  程序集

Content  静态内容,CSS 图片 等

Controllers  控制器

Models  视图模型与域模型类

Scripts  脚本与Javascript库

Views  视图与分布视图

Views/Shared  布局视图

Views/Web.config  视图配置文件,默认导入视图的命名空间

Global.asax  全局应用程序类,用于注册路由配置,初始化等

Web.config    应用程序配置文件

路由

Web Form情况下,每个ASPX页面既是文件,又是对请求的自包含相应。这样会使URL与服务器文件有直接的关系。

MVC情况下,请求是由控制器类中的动作方法进行处理。没有对文件的一对一关系。

为了处理URL,ASP.NET平台提供了 路由系统。

路由系统有两个功能:

1.输入URL,并推断请求想要那个控制器和动作。

2.输出URL,是在视图渲染HTML中出现的URL。可点击的URL。

MVC框架中有两种方法可以创建路由:约定路由 和 属性路由。

约定路由

App_Start 文件夹中的 RouteConfig 用来定义路由。由Global.asax.cs文件进行调用。定义片段应使用{}

Global.asax.cs 文件,注册区域路由与全局路由

 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas(); //注册区域路由
            RouteConfig.RegisterRoutes(RouteTable.Routes); //注册全局路由
        }

RouteConfig文件,注册路由

routes.MapRoute("MyRoutes", "{controller}/{action}"); //用于注册路由

注册路由并定义默认值,如不输入路由,则默认跳转。应该放到路由注册的最下方。

routes.MapRoute("MyRoutes", "{controller}/{action}", new { controller = "Home", action = "Index" }); //注册路由并定义默认值

定义路由别名,可以输入:http://localhost/Public 。 应在默认路由上方,则优先执行此方法,否则404错误。

routes.MapRoute("", "Public/{controller}/{action}", new { controller = "Admin", action = "Index" }); //路径别名

仅默认控制器,需传输动作方法

routes.MapRoute("ShopSchema", "Shop/{action}", new { controller = "Home" }); //仅默认控制器,需传输动作方法

设置路由别名,输入:http://localhost/Shop/OldAction 则进行跳转。

routes.MapRoute("ShopSchema2", "Shop/OldAction", new { controller = "Home", action = "Index" }); //设置路由别名

设置id变量。变量可以使用,RouteData.Values["id"]; 进行获取。或者使用参数变量进行获取。public ActionResult Index(string id){}

routes.MapRoute("MyRoutes", "{controller}/{action}/{id}", new { controller = "Home", action = "Index",id="DefaultId" }); //设置id变量

定义可选URL片段。此时id变量是可选的。

routes.MapRoute("MyRoutes", "{controller}/{action}/{id}", new { controller = "Home", action = "Index",id = UrlParameter.Optional });

定义可变长路由。此时catchall存放的所有的变量,使用/进行分割。

routes.MapRoute("MyRoutes", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index",id = UrlParameter.Optional });

按命名空间控制优先级,如同一个解决方法存在两个同名的控制器,可以根据命名空间进行区分。

命名空间,并非按照顺序区分,是同等级区分。下方代码,会优先查询Controllers此命名空间。如命名空间数组中,同名控制器依然存在,则报错。

 routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "UrlsAndRoutes.Controllers" });

禁用搜索命名空间

Route myRoute = routes.MapRoutes(...);
myRoute.DataTokens["UseNamespaceFallback"] = false;

约束路由

通过正则表达式来进行约束。例如只匹配H开头的URL

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new
                {
                    controller = "^H.*"
                },
                new[] { "UrlsAndRoutes.Controllers" });

约束到一组指定的值。action可以是Index 或 CustomVariable

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new
                {
                    action = "Index|CustomVariable"
                },
                new[] { "UrlsAndRoutes.Controllers" });

Http方法约束。只有Get方法可以进行调用。

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new
                {
                    httpMethod = new HttpMethodConstraint("Get")
                },
                new[] { "UrlsAndRoutes.Controllers" });

类型约束(值约束)

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new
                {
                    id = new RangeRouteConstraint(10, 20)
                },
                new[] { "UrlsAndRoutes.Controllers" });

组合约束

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new
                {
                    id = new CompoundRouteConstraint(new IRouteConstraint[] { new RangeRouteConstraint(10, 20), new MinLengthRouteConstraint(6) })
                },
                new[] { "UrlsAndRoutes.Controllers" });

路由属性类包含

AlphaRouteConstraint()  匹配字母字符

BoolRouteConstraint()  匹配可解析成bool类型的值

RangeRouteConstraint(min,max)  匹配一个值范围在min和max之间

具体内容参考:System.Web.Http.Routing.Constraints 命名空间

自定义约束

可以通过实现IRouteConstraint接口,来自定义约束。最终返回bool值。略

属性路由

MVC5增加了对属性路由的支持。可以自由地与标准的基于约定的路由相混合。默认情况下属性路由是禁用的。

启用和运用属性路由

routes.MapMvcAttributeRoutes(); 启用属性路由

// http://localhost:59518/Test
        [Route("Test")]
        public ActionResult Index()
        {
            ViewBag.Controller = "Home";
            ViewBag.Action = "Index";
            return View("ActionName");
        }

使用片段变量创建路由

//    http://localhost:59518/Test/123
[Route("Test/{id}")]
        public ActionResult CustomVariable(string id = "DefaultId")
        {
            ViewBag.Controller = "Home";
            ViewBag.Action = "CustomVariable";
            ViewBag.CustomVariable = id ?? "<no value>";
            return View();
        }

使用路由约束,约束id必须为int类型。

[Route("Test/{id:int}")]

组合类型约束

[Route("Test/{id:alpha:length(6)}")]

控制器普通前缀,需要在class进行约束定义

[RoutePrefix("Users")]

占位符

时间: 2024-10-21 01:59:38

MVC5知识点记录的相关文章

hadoop知识点记录

浅谈在shell脚本中使用HQL访问hive hadoop知识点记录,布布扣,bubuko.com

spring mvc开发过程知识点记录

给一个客户做的一个小项目,需求就是输入类似一个短网址http://dd.yy/xxxx然后跳转到另外一个域名下的图书文件.(实际很多短网址站都提供API供调用吧,不过客户需求是他自己建立一个短网址服务然后跳转到服务器上另外一个网站下载相应图书) 以前没单独用spring开发的经验,实际用java的经验也比较少,所以记录下开发过程中遇到的问题以及有价值的知识点记录下供自己和后来者备忘吧.有些地方理解或者写的可能有不对的地方,应急用的,先求保持功能可用即可.  配置: 1.web.xml 2.spr

【千纸诗书】—— PHP/MySQL二手书网站后台开发之知识点记录

前言:使用PHP和MySQL开发后台管理系统的过程中,发现有一些通用的[套路小Tip],这里集中记录一下.结合工作中ing的后台业务,我逐渐体会到:除了技术知识外.能使用户体验好的“使用流程设计”积累也十分重要╭( ???)? ?? 项目github地址:https://github.com/66Web/php_book_store,欢迎Star. 一.知识点记录 1.数据库的表名和列名 绝对不要和数据库的关键字相同  order  order by 订单表-indent   分类表-class

C#算法知识点记录

针对算法的知识点进行记录 桶排序 占位符

深度学习知识点记录

记录深度学习知识点 相关源码:https://coding.net/u/chenxygx/p/FrameworkResearch/git/tree/master/AI 参考: TensorFlow深度学习,一篇文章就够了 TensorFlow.MXNet.PaddlePaddle 对比 TensorFlowSharp入门使用C#编写TensorFlow人工智能应用 &

SqlServer知识点记录分享

知识点介绍 双向检索:这里就不大话概念了,直接说它的作用 ISNULL()函数:判断函数是否有值,如果变量没有赋值就给定指定的值,下面的例子就是如果@TOTALCOUNT变量为NULL那么就赋值为空字符串,如果我们将@TOTALCOUNT变量赋予了初始值那么就打印的是0否则是1,大家可以copy运行一下就知道了 DECLARE @TOTALCOUNT INT IF ISNULL(@TOTALCOUNT,'')='' PRINT '1' ELSE PRINT '0' LTRIM()去除变量的左边空

C#小知识点记录(QQ交流群的一个小问题)Linq提取数据

请教 这里 LINQ想 找到 最后的 4条 记录 然后放在 这里这个 List Linq查找怎么写呀? 解答:写了一个小例子作为解答. 1 namespace C_Sharp 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //声明 8 List<Person> listPerson = new List<Person>() { 9 new Person {Type="A", Fir

C#知识点记录

用于记录C#知识要点. 参考:CLR via C#.MSDN. 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Runtime)是一个可由多种编程语言(VB.F#等)使用的公共语言运行库. 托管模块:编译源码会生成托管模块,他是标准的PE文件.包含:PE32头.CLR头.IL中间语言. 元数据:CLR除了生成IL外,还会生成元数据.元数据总与包含IL代码的文件相关联. 程序集:是一个或多个模块/资源的逻辑性分组.是重用.安全性.版

Javascript知识点记录(三)设计模式

Javascript设计模式记录,这个方面确实是没写过,工作中也没有用到js设计模式的地方. 单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点.例如:线程池,全局缓存,登录浮窗. 首先我们需要把单例的逻辑代码单独提取,然后使用惰性单例的方式,也就是返回方法.只有在点击的时候,才会进行执行. javascript的单例,跟类不一样.无需创建多余的构造函数这些,直接创建全局变量即可. !(function () { //管理单例的逻辑代码,如果没有数据则创建,有数据则返回 var ge