.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 文件 就刪除,再重新來,最后寫入文件。具體邏輯可以自己改。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM