ASP.NET MVC——MVC-路由

Routing(路由) – URL

url 作为广泛使用的Web用户接口,需要被重视

好的Url应该满足如下条件:

  • URL应为获取某种资源提供信息,不一定是物理文件路径
  • 简短易于记忆和拼写输入
  • 可以反映出站点结构
  • 应该是【可拆分】,用户移除末尾,进而获得更高层次信息
  • 持久、不应改变

下面两种url哪种你更喜欢呢?
http://www.cnblogs.com/baka_no/1.html
http://www.cnblogs.com/baka_no/1
如果是后者,那服务器怎么识别呢?
ASP.NET MVC 使用路由机制完成由url到具体调用方法的映射过程
注:传统上,url代表服务器磁盘上的物理文件

Routing(路由)的作用

匹配传入的请求(不匹配服务器物理文件),并将请求映射到【控制器】的具体操作【Action方法】和 【参数】
调用并执行对应控制器类的Action方法
Global.asax.cs文件中定义了路由的识别规则

Routes.MapRoute(
         "Default", // 1.路由名称
         "{controller}/{action}/{id}", // 2.带有参数的URL
          new {
                   controller = "Home",
                   action = "Index",
                   id = UrlParameter.Optional
                 } // 3.参数默认值
       );

注:{controller}和{action}是特定参数名,不能改
RequestContext.RouteValueDictionary
SEO:Search Engine Optimization

Routing(路由)包含字面值的URL

路由URL在段中也允许包含【字面值】,如:     
/baka_no/{controller}/{action}/{id}
规定第一个段必须以 jiekzou 开头,才能与该路由匹配,如:
/baka_no/home/index/1
URL中可以字面量和参数混合在一期,如:

注:不能有两个连续的url参数 :{controller}{action}-{id}

路由约束
允许URL段使用正则表达式来限制路由是否匹配请求

routes.MapRoute(
                "blog", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },// 参数默认值               

                new{controller=@"\d{4}",action=@"\d{2}"}
);

路由按照先后顺序与传入的URL匹配,直到匹配成功为主

命名路由
生成指定路由名的 url超链接
@Html.RouteLink("test", "Default",
              new {contorller="home",action ="index",id=1 } );
注:会按照找到的路由规则生成超链接(没有使用默认值)
Action返回不同值
ViewResult – 执行并读取指定的 完整视图
PartialViewResult – 指定并读取指定的 分部视图
    分部视图:主要为某个页面提供部分html代码
          一般用在Ajax请求()
JsonResult -> ActionResult – 请求Json数据时
    return Json(object);//生成Json字符串
string – 直接返回字符串

验证码

public  ActionResult VCodeImg()
{
    VCode vcode = new VCode();
    byte[] bytes = vcode.CreateVImg();
    return File(bytes, @"image/jpeg");
}

获取当前请求路径:HtmlHelper.ViewContext.RequestContext.HttpContext.Request.Url.AbsolutePath;

Area 区域
MVC 项目目录结构 缺点:
1.不利于分功能协作开发(购物车/商品管理/用户权限管理…)
2.代码结构臃肿…
注:可使用Area区域解决,甚至可以从物理上分开
Area 区域 – 添加

Area 区域 展示-在同一项目中
Area包含:
一套新的MVC文件夹
**AreaRegistration.cs文件

Area 区域 展示-在不同项目中

区域路由注册类

public class WebViewsAreaRegistration : AreaRegistration
{
    public override string AreaName
    {  get { return "WebViews";  }  }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        //注册区域路由
        context.MapRoute(
            "WebViews_default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new string[] { "CRM.AreaController.WebViews" }//指定该路由查找控制器类的命名空间
        );
    }
}

Demo

1.  在解决方案上面新建一个MvcApplication1的MVC4项目

2、项目上右键->添加->Areas,输入"Admin"

3、添加控制器Home,并添加一个Index视图

4、在解决方案上面新建一个MvcApplication2的MVC4项目,并且删除Global.asax和Web.config两个文件

5.  在根目录新建一个AdminAreaRegistration的类,输入如下内容:

public class AdminAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Admin";
            }
        }

        public override void RegisterArea(AreaRegistrationContext  context)
        {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new
                {
                    action = "Index",
                    id = UrlParameter.Optional
                }
            );
        }
    }

6.  删除MvcApplication1项目/Areas/Admin文件夹下面的AdminAreaRegistration.cs文件以及Controllers文件夹(包括HomeController)

7.  在MvcApplication2项目的Controllers里面新建一个HomeController

8.  记得保留MvcApplication1/Areas/Admin下面的Views,并且在MvcApplication1项目里面引用MvcApplication2项目

为了使我们在MvcApplication2自动生成的View自动同步到MvcApplication1/Areas/Admin/Views 文件夹中,可以使用“生成事件(Build Event)”里的“Post-Build Event”,打开MvcApplication2的属性,修改如下所示:

mkdir "$(SolutionDir)$(SolutionName)\Areas\Admin\Views"

xcopy "$(ProjectDir)Views" "$(SolutionDir)$(SolutionName)\Areas\Admin\Views" /S /E /C /Y

现在再次访问/Admin/Home/Index就可以得到正确结果了,并且你可以发现Index.cshtml已经被复制到MvcApplication1/Areas/Admin/Views/Home目录里。

Area 区域运行原理

时间: 2024-10-26 03:00:00

ASP.NET MVC——MVC-路由的相关文章

asp.net MVC 5 路由 Routing

ASP.NET MVC ,一个适用于WEB应用程序的经典模型 model-view-controller 模式.相对于web forms一个单一的整块,asp.net mvc是由连接在一起的各种代码层所组成. 最近又接触了关于asp.net mvc的项目,又重拾以前的记忆,感觉忘了好多,特此记录. 首先,来说说路由Routing. ASP.NET MVC 不再是要依赖于物理页面了,你可以使用自己的语法自定义URL,通过这些语法来指定资源和操作.语法通过URL模式集合表达,也称为路由. 路由是代表

ASP.NET Core MVC/WebAPi如何构建路由?

前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾ASP.NET Core模型绑定 我们有这样一个场景:修改个人资料中的各个属性,此时每个属性的值的类型肯定是不一样的,所以我们将值定义为object,如下model. public class BlogViewModel { public string prop { get; set; } publi

[学习笔记] 理解ASP.NET MVC的路由系统

引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请求URL最终被传递给特定Controller的特定Action进行处理.而在相反的方向上,MVC框架的渲染器同样要利用这张路由表,生成最终的HTML页面并返回URL.所以,理解整个ASP.NET MVC的路由系统,有两个必须出现的关键元素:Controller与Action,有两个方向的操作:传入的

asp.net core 系列 5 MVC框架路由(上)

一. 概述 介绍asp.net core路由时,我初步想了下,分几篇来说明.  路由的知识点很多,参考了官方文档提取出一些重要的知识点来说.    在ASP.NET Core中是使用路由中间件来匹配传入请求的 URL 并将它们映射到操作(action方法).路由是在程序启动时进行传统路由或属性路由定义. 路由描述如何将 URL 路径与操作相匹配. 它还用于在响应中生成送出的 URL(用于链接). 路由操作既支持传统路由,也支持属性路由.也可混合使用.通常传统路由用于为浏览器处理 HTML 页面的

asp.net core 系列 6 MVC框架路由(下)

一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接. 生成 URL 可消除硬编码 URL,使代码更稳定.更易维护. 此部分重点介绍 MVC 提供的 URL 生成功能,并且仅涵盖 URL 生成工作原理的基础知识. IUrlHelper 接口用于生成 URL,是 MVC 与路由之间的基础结构的基础部分. 在控制器.视图和视图组件中,可通过 Url 属性找到 IUrlHelper 的实例. // // mvc 框架的Controll

Asp.Net MVC的路由

通过前面几篇博文的介绍,现在我们已经清楚了asp.net请求管道是怎么一回事了,这篇博文来聊聊MVC的路由. 其实MVC的请求管道和Asp.Net请求管道一样,只是MVC扩展了UrlRoutingModule的动作.我们知道MVC网站启动后第一个请求会执行Global.asax文件中的Application_Start方法,完成一些初始化工作,其中就会注册路由,先来看下面一张图,该图可以直观的展示了MVC执行的流程. 结合上图,我们一起来看看代码是如何实现路由的注册的. protected vo

asp.net core MVC 全局过滤器之ExceptionFilter过滤器(一)

本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过

ASP.NET Core MVC/WebAPi 模型绑定探索

前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用到了,你再去看理论性的文章时才会豁然开朗,这是我一直以来学习技术的方法.本文我们来讲解.NET Core中的模型绑定. 话题 在ASP.NET Core之前MVC和Web APi被分开,也就说其请求管道是独立的,而在ASP.NET Core中,WebAPi和MVC的请求管道被合并在一起,当我们建立控

第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderson 翻译:谢炀(kiler) 校对:何镇汐.

Pro ASP.NET Core MVC 第6版 第二章(后半章)

增加动态输出 整个web应用平台的关注点在于构建并显示动态输出内容.在MVC里,控制器负责构建一些数据并将其传给视图.视图负责渲染成HTML. 从控制器向视图传递数据的一种方式是使用ViewBag 对象,它是一个控制器基类的成员.ViewBag是一个动态对象,你可以给他赋值任意属性给视图来渲染用.代码2-5 演示了如何在HomeController里传递简单对象. Listing 2-5. 设置视图数据 using System; using Microsoft.AspNetCore.Mvc;