Пример #1
0
        // the render entrance
        public void Render(ViewModel viewModel)
        {
            lock (_syncObj)
            {
                ViewAttribute view = viewModel.GetType().GetAttribute<ViewAttribute>();

                if (view != null)
                {
                    RenderTemplate(view, viewModel);
                }
            }
        }
Пример #2
0
        // Render from template file
        private void RenderTemplate(ViewAttribute viewAttr, ViewModel viewModel)
        {
            if (_viewParser == null)
            {
                throw new Exception("there are not any ViewParser");
            }

            Type viewModelType = viewModel.GetType();

            // if debug, will be read file from local path "_debug folder"
            if (viewModel.DeBug)
            {
                string content = ReadFeatureFromTemporaryFile(viewModelType.FullName);

                if (!string.IsNullOrEmpty(content))
                {
                    Context.Response.Write(this._viewParser.Parse(content, viewModel));
                    return;
                }
            }

            // find from cache
            if (_viewCache.ContainsKey(viewAttr.ViewName))
            {
                Context.Response.Write(this._viewParser.Parse(_viewCache[viewAttr.ViewName].ToString(), viewModel));
            return;
            }

            Stream strm = null;

            try
            {
                // from internet
                if (Regex.IsMatch(viewAttr.ViewName, @"^http(s)?\:\/\/", RegexOptions.IgnoreCase))
                {
                    var httpRequest = (HttpWebRequest)WebRequest.Create(viewAttr.ViewName);
                    var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
                    strm = httpResponse.GetResponseStream();
                }
                // from local path
                else if (Regex.IsMatch(viewAttr.ViewName, @"\~/(\w+(/)?)+(\.\w+)"))
                {
                    // convert to physics Path
                    var physicsPath = Context.Server.MapPath(viewAttr.ViewName);

                    if (File.Exists(physicsPath))
                    {
                        strm = new FileStream(physicsPath, FileMode.Open);
                    }
                }
                // from embed resources
                else
                {
                    strm = viewModel.GetType().Assembly.GetManifestResourceStream(viewAttr.ViewName);
                }

                if (strm == null)
                {
                    Context.Response.StatusCode = 404;
                    return;
                }

                using (StreamReader stmR = new StreamReader(strm))
                {
                    string content = stmR.ReadToEnd();

                    if (!string.IsNullOrEmpty(content) && !_viewCache.ContainsKey(viewAttr.ViewName))
                    {
                        _viewCache.Add(viewAttr.ViewName, content);
                    }

                    // if debug output the content to a file that saved in loacl path "_debug folder"
                    if (viewModel.DeBug)
                    {
                        WriteFeatureToTemporaryFile(content, viewModelType.FullName);
                    }

                    Context.Response.Write(this._viewParser.Parse(content, viewModel));
                }
            }
            catch (Exception ex)
            {
                Engine.Logging(EngineLogger.Level.Error, ex, ex.Message);
                throw ex;
            }
            finally
            {
                if (strm != null)
                {
                    strm.Dispose();
                }
            }
        }