MVC 模式下的伪静态:html
经过路由就能够搞定web
首先说下路由规则,容许多个路由规则,会从上之下寻找匹配ide
伪静态:this
若是只写一个路由 那么 全部页面都必须是 html 结尾。spa
若是再加一个路由code
就都支持了。htm
真静态:blog
配置文件以下:继承
system.webServer 下的 handlers 增长接口
几个节点
<remove name="BlockViewHandler" />
<add name="htmlHandler" verb="GET,HEAD" path="*.html" type="System.Web.StaticFileHandler"/>
<add name="BlockViewHandler" verb="*" path="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler"/>
路由不变
增长代码:
public class StaticPageFilterAttribute : FilterAttribute, IResultFilter { public void OnResultExecuted(ResultExecutedContext filterContext) { } public void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Filter = new Myclass(filterContext.HttpContext.Response.Filter, filterContext); } class Myclass : Stream { private Stream inner; private ControllerContext context; public Myclass(Stream s, ControllerContext context) { this.inner = s; this.context = context; } public override bool CanRead { get { return inner.CanRead; } } public override bool CanSeek { get { return inner.CanSeek; } } public override bool CanWrite { get { return inner.CanWrite; } } public override void Flush() { inner.Flush(); } public override long Length { get { return inner.Length; } } public override long Position { get { return inner.Position; } set { inner.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return inner.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return inner.Seek(offset, origin); } public override void SetLength(long value) { inner.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { inner.Write(buffer, offset, count); try { string p = context.HttpContext.Server.MapPath(HttpContext.Current.Request.Path); if (Path.HasExtension(p)) { string dir = Path.GetDirectoryName(p); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (File.Exists(p)) { File.Delete(p); } File.AppendAllText(p, Encoding.UTF8.GetString(buffer)); } } catch { } } } }
[StaticPageFilter] public ActionResult Index(int id) { return View((object) id); }
view 中:
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } @model int <h2>Index</h2> <span>@Model.ToString()</span>
写一个特性 类 继承 FilterAttribute, IResultFilter 2个接口 叫作 StaticPageFilterAttribute,使用的时候 就是 [StaticPageFilter] 加在action方法上面 ,实现 IResultFilter 的2个方法
主要是 OnResultExecuting 方法,方法 参数是 继承自 ControllerContext 类,控制器 上下文,所以能够获取 相应结束的全部信息,而后 从新改写流里面的数据,也能够把流里面的数据copy出来。
StaticPageFilterAttribute 类里面 写一个内部内 基础 stream ,为的就是改写流。
若是没有后缀就无论,若是存在html 文件 就删除,再从新来,最后写入文件。具体逻辑能够本身改。