.net 伪静态、真静态 (mvc)
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 文件 就删除,再重新来,最后写入文件。具体逻辑可以自己改。