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 文件 就刪除,再從新來,最後寫入文件。具體邏輯能夠本身改。