MVC 模式下的偽靜態:
通過路由就可以搞定
首先說下路由規則,允許多個路由規則,會從上之下尋找匹配
偽靜態:
如果只寫一個路由 那么 所有頁面都必須是 html 結尾。
如果再加一個路由
就都支持了。
真靜態:
配置文件如下:
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 文件 就刪除,再重新來,最后寫入文件。具體邏輯可以自己改。