コード例 #1
0
ファイル: Engine.cs プロジェクト: lanicon/MiniMvc-1
        public void ProcessRequest(string controllerName, string actionName, Dictionary <string, object> parameters, TextWriter output)
        {
            MemoryStream bodyContent = _streamingMode ? null : new MemoryStream();
            TextWriter   bodyWriter  = _streamingMode ? null : new StreamWriter(bodyContent);

            _pipelineFilter.BeginRequest(controllerName, actionName, parameters);

            var controller = _controllerFactory.CreateController(controllerName);

            InitializeController(controller);
            var actionRunner = _actionFinder.FindAction(controller, controllerName, actionName);

            ExecuteActionWithFilter(controllerName, actionName, parameters, controller, actionRunner);
            string layoutName = null;

            if (ViewLoader.HasViewStart())
            {
                var viewStart = FindAndExecuteSharedView(SharedViewRole.ViewStart, "_ViewStart", _streamingMode ? output : bodyWriter, controller, null, null, null);
                layoutName = viewStart.Layout;
            }
            var view = FindAndExecuteView(controllerName, actionName, parameters, _streamingMode ? output : bodyWriter, controller, layoutName);

            if (view.Layout != null)
            {
                if (_streamingMode)
                {
                    throw new Exception("Can't use layouts in streaming mode, set MiniMvc.Engine.StreamingMode to false");
                }
                bodyWriter.Flush();
                view.InitializeView(output, this, new RenderContext());
                FindAndExecuteSharedView(SharedViewRole.Layout, view.Layout, output, null, view, bodyContent, view.Sections);
            }
            else
            {
                if (!_streamingMode)
                {
                    bodyWriter.Flush();
                    bodyContent.Seek(0, SeekOrigin.Begin);
                    var bodyReader = new StreamReader(bodyContent);
                    CopyStream(bodyReader, output);
                }
            }

            _pipelineFilter.RequestComplete(controller, controllerName, actionName, parameters);
        }