// the render entrance public void Render(ViewModel viewModel) { lock (_syncObj) { ViewAttribute view = viewModel.GetType().GetAttribute<ViewAttribute>(); if (view != null) { RenderTemplate(view, viewModel); } } }
// 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(); } } }