zoukankan      html  css  js  c++  java
  • .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 文件 就删除,再重新来,最后写入文件。具体逻辑可以自己改。

  • 相关阅读:
    uniGUI学习之ExtJS之xtype容器内创建元素的简便方法(52)
    uniGUI学习之ExtJS事件(51)
    uniGUI学习之自定义CSS之如何找控件属性(50)
    uniGUI学习之自定义CSS(49)
    CANoe CAPL 之 Checksum and Counter
    PYTHON3 之 IVI的CAN总线自动化测试
    CAP原则(CAP定理)、BASE理论
    iOS 项目运行pod install报错 could not find compatible versions
    Xcode 11.7 安装报Failed to find a suitable device for the type IBSimDeviceTypeiPad2x
    Flutter 异常捕获框架catcher
  • 原文地址:https://www.cnblogs.com/bingguang/p/5262628.html
Copyright © 2011-2022 走看看