MVC中的AppendTrailingSlash以及LowercaseUrls
asp.net MVC是一个具有极大扩展性的框架,可以在从Url请求开始直到最终的html的渲染之间进行扩展,所以要学好还是需要了解框架的运行原理,推荐Artech.
今天我们回忆的不是MVC中的filter,也不是Controller的激活或者是Action的执行,或者是Url路由RouteData的生成,我们来回忆的是RouteTable.Routes ,即全局路由表的两个属性。AppendTrailingSlash以及LowercaseUrls。
AppendTrailingSlash的作用就是是否在 生成 的Url末尾添加/ 斜线(如果没有存在的话)。设置为true,则会在生成的Url末尾添加斜线,否则不会 自动添加。
LowercaseUrls的作用就是是否将生成的Url 转换成小写形式。因为对于搜索引擎来说,可能Url地址的大小写会不同对待。
这两个属性作用的是生成的Url,即会通过RouteTable.Routes.GetVirtualPath()通过传入的请求上下文RequestContext来获取Url。
可能你会说,如果我想实现生成的Url小写,那么我就将LowercaseUrls设置为true,就可以,事实真的是这样的吗?我们来做个试验。
注册的Url路由:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.AppendTrailingSlash = true;//是否添加斜线 分隔符
routes.LowercaseUrls = true;//Url是否小写
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "index", id = UrlParameter.Optional },
namespaces: new string[] { "MvcApplication3.Controllers" }
);
}
}
对应的Action方法:
[ActionName("List")]
public ActionResult List()
{
ViewBag.employees = repository.EmployeeRepository.GetEmployees("");///是获取一个几个列表
return View();
}
对应的View:
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>List</title>
</head>
<body>
<div>
@{
List<MvcApplication3.Models.Employee> listEmployee = ViewBag.Employees as List<MvcApplication3.Models.Employee>;
}
@{
if (listEmployee != null)
{
<ul>
@{ foreach (var item in listEmployee)
{
<li>
@Html.RouteLink("RouteLink"+item.Name, "Default", new { action = "Detail", controller = "Home", id = item.Id })
<br />
@Html.ActionLink("ActionLink"+item.Name, "DETAIL", "home", new { id = item.Id }, new { target = "_blank" })
</li>
}
}
</ul>
}
else
{ <div>列表中无数据显示</div>
}
}
</div>
</body>
</html>
我们在视图中通过Html.RouteLink以及Html.AtionLink来分别生成两个超链接。执行的结果是什么呢?
<li>
<a href="/home/detail/0/">RouteLinkguozhiqi0</a> <!--这是通过RouteLink生成的Url-->
<br />
<a href="/home/DETAIL/0" target="_blank">ActionLinkguozhiqi0</a> <!--这是通过ActionLink生成的Url-->
</li>
通过上面的结果我们可以看到一个奇怪的现象,就是通过Html.RouteLink()生成的Url应用了我们设置的属性,即Url地址全局小写,并且末尾有一个斜线分隔符。
但是ActionLink却没有在末尾添加斜线,也没有全部小写。这究竟是为什么呢?如果有人知道,麻烦告知一下具体区别。谢谢。
所以如果我们想生成全部小写并且末尾有斜线分隔符的Url地址,就采用RouteLink或者重写Route的getVirtualpathData()来将所有大写字母小写化。
注意:当没有添加区域的时候,Url.Action()生成的链接是小写的,但加上区域后失效
MVC中的AppendTrailingSlash以及LowercaseUrls的更多相关文章
- asp.net MVC中的AppendTrailingSlash以及LowercaseUrls
asp.net MVC中的AppendTrailingSlash以及LowercaseUrls asp.net MVC是一个具有极大扩展性的框架,可以在从Url请求开始直到最终的html的渲染之间进行 ...
- 谈谈asp.net MVC中的AppendTrailingSlash以及LowercaseUrls ,你还记得吗?
asp.net MVC是一个具有极大扩展性的框架,可以在从Url请求开始直到最终的html的渲染之间进行扩展,所以要学好还是需要了解框架的运行原理,推荐Artech. 今天我们回忆的不是MVC中的fi ...
- Asp.net mvc 中的路由
在 Asp.net mvc 中,来自客户端的请求总是针对某个 Controller 中的 Action 方法,因此,必须采用某种机制从请求的 URl 中解析出对应的 Controller 和 Acti ...
- .NetCore MVC中的路由(2)在路由中使用约束
p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- ASP.NET Core MVC 中的 [Controller] 和 [NonController]
前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...
- ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理
话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...
随机推荐
- .net 开发定时执行的windows服务
环境:win7+vs2010+Oracle11g+office2010(64位操作系统) 需求:开发定时执行的windows服务从数据库中查询数据下载到指定地址Excel中 一.添加新建项目——win ...
- ios swift(1)冒泡排序
//冒泡排序 稳定性最高 时间复杂度高 O(n(2)) ,交换次数太多, 一次交换等于三次赋值 最简单 var count = 0 func sortInts(inout data : [I ...
- MySQL在Linux系统下配置文件详解
在日常的的开发过程中接触到了SQLServer和MySQL数据库的操作性问题,可能是以前接触的都是SQL Server,才开始接触MySQL,总感觉使用MySQL没有使用SQLserver那么顺手,一 ...
- 方法覆盖(override)”的要点
方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)!请自行编写代码测试以下特性:在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 结论: 在“ ...
- React/React Native的 ES5 ES6 写法对照
ES5 ES6 模块 var React = require("react-native); var { Image, Text, View } = React; import Re ...
- NAS4Free 安装配置(四)配置硬盘
配置硬盘 磁盘管理 进入磁盘管理界面:Disks|Management 磁盘管理 点击Import disks导入磁盘 把第4个4G的DOM盘删掉,因为我们不在这个盘上存放数据 点Apply chan ...
- Hdu1096
#include <stdio.h> int main() { int T,n; ; while(scanf("%d",&T)!=EOF){ while(sca ...
- 搭建MHA环境【1】规划+linux相关的设置
[1]规划 MHA这套软件包涵两个部分 1.manager :主要负责对MySQL集群状态的检查&在master 库宕机时对故障进行转移. 2.node :主要包涵状态检查& ...
- PowerShell 远程管理之 about_Remote_Troubleshooting
主题 about_Remote_Troubleshooting 简短说明 说明如何解决 Windows PowerShell 中的远程操作的问题. 详细说明 本节描述您在使用 Windows Powe ...
- Spring AOP 本质(4)
这一主要看看Spring AOP是如何实现通知包围的. Spring AOP包围通知在功能上和前置通知加后置通知类似,但还是有区别的:包围通知可以修改返回值,还可以阻止.替换目标方法的执行. ...