Example #1
0
        /// <summary>
        /// 创建 HtmlContentResult 实例
        /// </summary>
        /// <param name="provider">负责加载的提供程序</param>
        /// <param name="content">加载的内容</param>
        /// <param name="virtualPath">内容的虚拟路径</param>
        /// <param name="cacheKey">缓存内容所使用的缓存键</param>
        public HtmlContentResult(IHtmlContentProvider provider, string content, string virtualPath, string cacheKey)
        {
            if (provider == null)
            {
                throw new ArgumentNullException("provider");
            }

            if (content == null)
            {
                throw new ArgumentNullException("content");
            }

            if (virtualPath == null)
            {
                throw new ArgumentNullException("virtualPath");
            }

            if (!VirtualPathUtility.IsAppRelative(virtualPath))
            {
                throw HtmlProviders.VirtualPathFormatError("virtualPath");
            }

            Provider    = provider;
            Content     = content;
            VirtualPath = virtualPath;
            CacheKey    = cacheKey;
        }
        private void OnPreMapRequestHandler(object sender, EventArgs e)
        {
            var context = HttpContext.Current;


            var request = context.Request;

            var result = HtmlProviders.MapRequest(new HttpRequestWrapper(request));

            if (result == null)
            {
                return;
            }


            var handler = result.Handler;

            var httpHandler = handler as JumonyHandler;

            if (httpHandler == null)
            {
                httpHandler = new HttpHandler(handler);
            }


            context.SetMapping(result);

            context.RemapHandler(httpHandler);
        }
Example #3
0
        /// <summary>
        /// 检测是否能加载指定虚拟路径的文档内容
        /// </summary>
        /// <param name="virtualPath">虚拟路径</param>
        /// <returns>是否能加载指定虚拟路径的文档内容</returns>
        public bool CanLoadContent(string virtualPath)
        {
            if (!VirtualPathUtility.IsAppRelative(virtualPath))
            {
                throw HtmlProviders.VirtualPathFormatError("virtualPath");
            }

            return(SupportedExtensions.Contains(VirtualPathUtility.GetExtension(virtualPath)));
        }
Example #4
0
        /// <summary>
        /// 加载 HTML 文档内容
        /// </summary>
        /// <param name="virtualPath">虚拟路径</param>
        /// <returns></returns>
        public HtmlContentResult LoadContent(string virtualPath)
        {
            if (!VirtualPathUtility.IsAppRelative(virtualPath))
            {
                throw HtmlProviders.VirtualPathFormatError("virtualPath");
            }

            var provider = GetProvider(virtualPath);

            return(provider.LoadContent(virtualPath));
        }
Example #5
0
        private static Uri CreateDocumentUri(string virtualPath)
        {
            if (virtualPath == null)
            {
                throw new ArgumentNullException("virtualPath");
            }

            if (!VirtualPathUtility.IsAppRelative(virtualPath))
            {
                throw HtmlProviders.VirtualPathFormatError("virtualPath");
            }

            return(new Uri(baseUri, VirtualPathUtility.ToAbsolute(virtualPath)));
        }
Example #6
0
        /// <summary>
        /// 尝试获取缓存的输出
        /// </summary>
        /// <returns>缓存的输出</returns>
        protected virtual ICachedResponse ResolveCache()
        {
            var policy = HtmlProviders.GetCachePolicy(HttpContext);

            if (policy == null)
            {
                return(null);
            }


            CachePolicy = policy;

            return(CachePolicy.ResolveCache());
        }
Example #7
0
        /// <summary>
        /// 派生类可以重写此方法自定义加载虚拟路径处的文档的逻辑
        /// </summary>
        /// <returns></returns>
        protected virtual IHtmlDocument LoadDocument(string virtualPath, out CacheDependency cacheDependency)
        {
            string cacheKey;
            var    document = HtmlProviders.LoadDocument(virtualPath, out cacheKey);

            if (cacheKey != null)
            {
                cacheDependency = new CacheDependency(new string[0], new string[] { cacheKey });
            }

            else
            {
                cacheDependency = HtmlProviders.CreateCacheDependency(virtualPath);
            }

            return(document);
        }
Example #8
0
        /// <summary>
        /// 获取指定虚拟路径的文档内容加载程序
        /// </summary>
        /// <param name="virtualPath">虚拟路径</param>
        /// <returns></returns>
        public IHtmlContentProvider GetProvider(string virtualPath)
        {
            if (!VirtualPathUtility.IsAppRelative(virtualPath))
            {
                throw HtmlProviders.VirtualPathFormatError("virtualPath");
            }

            var extensions = VirtualPathUtility.GetExtension(virtualPath);
            IHtmlContentProvider provider;

            lock ( _sync )
            {
                if (data.TryGetValue(extensions, out provider))
                {
                    return(provider);
                }

                else
                {
                    return(null);
                }
            }
        }
Example #9
0
        /// <summary>
        /// 利用指定 VirtualPathProvider 将虚拟路径所指向文件当作静态文件加载。
        /// </summary>
        /// <param name="provider">指定的 VirtualPathProvider</param>
        /// <param name="virtualPath">虚拟路径</param>
        /// <returns>加载结果</returns>
        public HtmlContentResult LoadContent(VirtualPathProvider provider, string virtualPath)
        {
            if (!VirtualPathUtility.IsAppRelative(virtualPath))
            {
                return(null);
            }

            if (!provider.FileExists(virtualPath))
            {
                return(null);
            }

            var file = provider.GetFile(virtualPath);

            if (file == null)
            {
                return(null);
            }



            var key = provider.GetCacheKey(virtualPath) ?? "StaticFile_" + virtualPath;

            var content = HttpRuntime.Cache.Get(key) as string;


            if (content == null)
            {
                var dependency = HtmlProviders.CreateCacheDependency(provider, virtualPath);
                content = LoadContent(file);

                HttpRuntime.Cache.Insert(key, content, dependency);
            }


            return(new HtmlContentResult(this, content, virtualPath, key));
        }
Example #10
0
        /// <summary>
        /// 加载文档
        /// </summary>
        /// <param name="cacheKey">文档缓存键</param>
        /// <returns>HTML 文档</returns>
        protected virtual IHtmlDocument LoadDocument(out string cacheKey)
        {
            var document = HtmlProviders.LoadDocument(new HttpContextWrapper(HttpContext.Current), TemplatePath, out cacheKey);

            return(document);
        }
Example #11
0
        /// <summary>
        /// 渲染部分视图(重写此方法以实现自定义输出 partial 元素)
        /// </summary>
        /// <param name="partialElement">partial 元素</param>
        /// <returns></returns>
        protected virtual string RenderPartial(IHtmlElement partialElement)
        {
            var action  = partialElement.Attribute("action").Value();
            var view    = partialElement.Attribute("view").Value();
            var path    = partialElement.Attribute("path").Value();
            var handler = partialElement.Attribute("handler").Value();
            var name    = partialElement.Attribute("name").Value();

            if (!_partialExecutors.IsNullOrEmpty() && name != null)
            {
                var executor = _partialExecutors.FirstOrDefault(e => e.Name.EqualsIgnoreCase(name));
                if (executor != null)
                {
                    var wrapper = ViewHandler as IHandlerWrapper;
                    if (wrapper != null)
                    {
                        return(executor.Execute(wrapper.Handler, partialElement));
                    }
                    else
                    {
                        return(executor.Execute(ViewHandler, partialElement));
                    }
                }
            }


            var helper = MakeHelper();


            try
            {
                if (action != null)//Action 部分视图
                {
                    var routeValues = Url.GetRouteValues(partialElement);

                    return(RenderAction(partialElement, action, partialElement.Attribute("controller").Value(), routeValues));
                }

                else if (view != null)
                {
                    return(RenderPartial(partialElement, view));
                }

                else if (path != null)
                {
                    if (!VirtualPathUtility.IsAppRelative(path))
                    {
                        throw new FormatException("path 只能使用应用程序根相对路径,即以 \"~/\" 开头的路径,调用 VirtualPathUtility.ToAppRelative 方法或使用 HttpRequest.AppRelativeCurrentExecutionFilePath 属性获取");
                    }

                    var content = HtmlProviders.LoadContent(path);
                    if (content != null)
                    {
                        return(content.Content);
                    }
                }
            }
            catch (ThreadAbortException)
            {
            }
            catch //若渲染时发生错误
            {
                if (MvcEnvironment.Configuration.IgnorePartialRenderException || partialElement.Attribute("ignoreError") != null)
                {
                    return("<!--parital view render failed-->");
                }
                else
                {
                    throw;
                }
            }

            throw new NotSupportedException("无法处理的partial标签:" + ContentExtensions.GenerateTagHtml(partialElement, false));
        }
Example #12
0
        /// <summary>
        /// 加载文档
        /// </summary>
        /// <param name="cacheKey">文档缓存键</param>
        /// <returns>HTML 文档</returns>
        protected virtual IHtmlDocument LoadDocument(out string cacheKey)
        {
            var document = HtmlProviders.LoadDocument(VirtualPath, out cacheKey);

            return(document);
        }
Example #13
0
 public CachePolicy CreateCachePolicy(HttpContextBase context)
 {
     return(HtmlProviders.GetCachePolicy(context));
 }