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 重写的更多相关文章

  1. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...

  2. asp.net -mvc框架复习(5)-ASP.NET MVC中的视图简单使用

    1.视图分类 ASPX视图(现在讲解) Razor视图(后面讲解) ASPX 视图: 2.@page指令 作用:页面的声明 要求:必须放在第一行,常用指令属性如下: 3.服务器端内嵌语法 小脚本:在A ...

  3. .net mvc中一种简单的工作流的设计

    开篇前的废话:工作流是我们在做互联网应用开发时经常需要用到的一种技术,复杂的工作流我们基本是借助一些开源的 工作流项目来做,比如 ccflow等,但是有时候,我们只需要实现一些简单的工作流流程,这时候 ...

  4. ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  5. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  6. 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, ...

  7. ASP.NET MVC中实现多个按钮提交的几种方法

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

  8. 【MVC】ASP.NET MVC中实现多个按钮提交的几种方法

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...

  9. ASP.NET MVC中Area的另一种用法

    ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...

随机推荐

  1. js创建与追加元素

    用javascript创建元素 : var NewNode = document.creatElement('div'); 结合appendChild与insertBefore插入到DOM树中 ins ...

  2. jQuery第一篇 (帅哥)

      同学心目中的jQuery: 简单易用,功能强大,对移动端来说,体积稍大. 1.1 回顾前面学到的js我们遇到的一些痛点 window.onload 事件有个事件覆盖的问题,我们只能写一个 代码容错 ...

  3. 专业上的常用的工具和类库集 By 老衣

    Visual Studio 2013 扩展 CodeMaid: 可快速整理代码文件,清理不必要的代码和杂乱的格式.并在开发时实时提供代码复杂度的报告,以便帮助开发人员降低代码复杂度.提高代码质量. C ...

  4. 火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题

    一.先遇到document.body.scrollTop值为0的问题 做页面的时候可能会用到位置固定的层,读取document.body.scrollTop来设置层的位置,像这样, window.on ...

  5. 计算程序总行数的Python代码

    最近需要统计一下项目中代码的总行数,写了一个Python小程序,不得不说Python是多么的简洁,如果用Java写至少是现在代码的2倍. import os path="/Users/ron ...

  6. 前端学PHP之运算符

    × 目录 [1]总括 [2]算术运算符 [3]赋值运算符[4]位运算符[5]比较运算符[6]错误控制[7]逻辑运算符[8]字符串连接[9]数组运算符 前面的话 运算符是可以通过给出的一或多个表达式来产 ...

  7. .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]

    经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com ...

  8. 【原创】.NET平台机器学习组件-Infer.NET连载(一)介绍

    Infer.NET机器学习翻译系列文章将进行连载,感兴趣的朋友请收藏或关注             本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/428 ...

  9. 支持向量机原理(四)SMO算法原理

    支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五) ...

  10. Jackson的简单用法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1简介 Jackson具有比较高的序列化和反序列化效率,据测试,无论是 ...