asp.net mvc 中 一种简单的 URL 重写
asp.net mvc 中 一种简单的 URL 重写
Intro
在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化,当时就是只想做成伪静态化以后可能会做成完全静态化),至于为什么做伪静态化或静态化可以自行百度或参考本文最后 Q&A 部分。
How to do
Step0 注册路由
在注册默认路由前添加自己的重写路由,如下所示的 “Notice routes” 所示,第一个参数是 路由名称,请保持在整个Web应用中唯一,第二个参数是 url,提供一个你想要重写的 url 模板,模板参数放在 “{” 和 “}”之间, 第三个参数是设置是重写指向的 controller 和 action(有时只指定 controller,看重写需求),namespace指定需要处理的 controller 所在命名空间,当只有一个区域时可以不写,多个区域的时候最好显式指定对应的命名空间,防止路由冲突。
【注:新增的路由必须放在默认路由前面,不然不会有效果】
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//notice route
routes.MapRoute("Notice", "Notice/{path}", new { controller = "Home", action = "NoticeDetails" }, namespaces: new string[] { "ActivityReservation.Controllers" });
//default route
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "ActivityReservation.Controllers" },
constraints:new { id = @"\d*"}
);
}
Step1 编写控制器处理代码
在上一步注册路由的过程中,我们指定了处理的 controller(和 action ),接下来就需要在 controller 中处理请求了。
controller 中处理代码示例如下:
/// <summary>
/// 公告详情
/// </summary>
/// <param name="path">访问路径</param>
/// <returns></returns>
public ActionResult NoticeDetails(string path)
{
if (String.IsNullOrEmpty(path))
{
return RedirectToAction("Notice");
}
try
{
var notice = new Business.BLLNotice().GetOne(n => n.NoticePath == path);
if (notice != null)
{
return View(notice);
}
else
{
return RedirectToAction("Notice");
}
}
catch (Exception ex)
{
logger.Error(ex);
throw;
}
}
在定义路由的时候,定义了一个模板参数“path”,在处理的 action 中直接作为方法的参数处理就可以喽
Step2 调试代码,看重写效果
如果可以出现如下图所示的页面,那么恭喜你,今天的 url 重写完成了。
Q&A
Q:为什么我们要做(伪)静态化?
A:站点下的 *.html 文件有利于网站的 SEO 优化,有利于百度和google爬虫爬你的网站,SEO做的好有利于提高搜索排名【SEO的水也很深、感兴趣的可以自己找资料研究】。
Q:什么是伪静态化?什么是完全静态化?他们的区别是什么?
A:伪静态化是针对完全静态化来说的,(完全)静态化是会实际保存内容到一个 *.html 文件中,而伪静态化则是通过服务器端技术通过匹配 url 符合一定的模式就重新交给指定的程序处理并返回内容。
简单来说,(完全)静态化会有一个实际存在的静态文件,伪静态化则不存在,需要较多服务器端的处理。
Q:伪静态化和完全静态化哪个好?
A:这个问题更好的问法应该是这样的:“什么时候适合用伪静态化?什么时候适合用完全静态化?”,一个事物既然存在就必然有它存在的道理,如果没有存在的意义必将死去。
完全静态化一般会根据一个模板生成一个实际存在的 *.html 文件,完全静态化不需要太多的服务器端处理,客户端请求这个文件时因为是一个静态文件服务器会直接将文件内容返回给客户端,不需要额外的服务器处理。
完全静态化会减少服务器的压力。
伪静态化服务器上并没有静态 *.html文件,只是在服务器断使用了Rewrite,将动态URL进行重写,使动态URL表现为静态URL,以满足网页URL静态需求但网页依然为动态调用的,,是需要很多服务器端处理的,比如url的模式匹配,从数据库中查询数据。
总结:虽然完全静态化URL的网页有打开速度快的优点,但是网站内容巨大的话,势必会使网站的体积变大很多,网站迁移的话很麻烦,另一方面如果网站内容很多的时候修改模板的话,再次静态化的时候会是一个很大的工作量。
实际使用的话还是需要根据自己实际需要来选取。
End
本文主要讲解了如何简单的做一个 mvc 中的 url 重写,实现了一个通知公告的伪静态化功能(以后可能会修改为完全静态化)。
asp.net mvc 中 一种简单的 URL 重写的更多相关文章
- 在ASP.NET MVC中使用IIS级别的URL Rewrite
原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...
- asp.net -mvc框架复习(5)-ASP.NET MVC中的视图简单使用
1.视图分类 ASPX视图(现在讲解) Razor视图(后面讲解) ASPX 视图: 2.@page指令 作用:页面的声明 要求:必须放在第一行,常用指令属性如下: 3.服务器端内嵌语法 小脚本:在A ...
- .net mvc中一种简单的工作流的设计
开篇前的废话:工作流是我们在做互联网应用开发时经常需要用到的一种技术,复杂的工作流我们基本是借助一些开源的 工作流项目来做,比如 ccflow等,但是有时候,我们只需要实现一些简单的工作流流程,这时候 ...
- ASP.NET MVC中使用Unity进行依赖注入的三种方式
在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- ASP.NET MVC中实现多个按钮提交的几种方法
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- 【MVC】ASP.NET MVC中实现多个按钮提交的几种方法
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- ASP.NET MVC中Area的另一种用法
ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...
随机推荐
- 群福利:百度云管家-本地SVIP
效果 如果不想登录破解版的百度云(防止泄密)==>复制AppSettingApp.dat和users文件夹,这样你就可以免登录了 最稳定版本:https://yunpan.cn/cBTQc9Iu ...
- WPF如何仿制QQ2013登录窗口的关闭效果
昨天,有位朋友问我,WPF能做出像QQ2013窗口在关闭时那个貌似透明过渡的动画吗?我就歪着脸跟他说:"只有你想不到的,没有WPF做不到的". 他又接着说:"我知道肯定会 ...
- WPF 子窗体关闭时显示父窗体
这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...
- EntityFramework之原始查询及性能优化(六)
前言 在EF中我们可以通过Linq来操作实体类,但是有些时候我们必须通过原始sql语句或者存储过程来进行查询数据库,所以我们可以通过EF Code First来实现,但是SQL语句和存储过程无法进行映 ...
- iOS开发之使用Storyboard预览UI在不同屏幕上的运行效果
在公司做项目一直使用Storyboard,虽然有时会遇到团队合作的Storyboard冲突问题,但是对于Storyboard开发效率之高还是比较划算的.在之前的博客中也提到过,团队合作使用Storyb ...
- 如何用Excel直接查询Oracle中的数据
将Oracle中查询的数据保存为Excel文件,通常使用的是PL/SQL Developer. 其实,Excel可直接写SQL语句查询Oracle中数据,在这里,用到ODBC驱动.详细步骤如下: 一. ...
- tomcat匹配请求流程(原创)
tomcat8.0.36 配置Connector属性allowTrace为true时,允许TRACE方法,默认禁止. tomcat8.0.36有一个BUG,该BUG在8.0.37里被修复,就是一个解析 ...
- c# 实现简单udp数据的发送和接收
服务端代码 static void Main(string[] args) { UdpClient client = null; string receiveString = null; byte[] ...
- Callbacks vs Events
前言:本文翻译自Dean Edwards的一篇文章,原文地址:http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/. 文章主要指出了 ...
- 【中文分词】简单高效的MMSeg
最近碰到一个分词匹配需求--给定一个关键词表,作为自定义分词词典,用户query文本分词后,是否有词落入这个自定义词典中?现有的大多数Java系的分词方案基本都支持添加自定义词典,但是却不支持HDFS ...