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 文件 就删除,再重新来,最后写入文件。具体逻辑可以自己改。