Beispiel #1
0
        private async Task ExecutePageAsync()
        {
            Type viewDataType     = null;
            var  viewDataProperty = _actionDescriptor.PageType.GetDeclaredProperty("ViewData");

            if (viewDataProperty != null)
            {
                var viewDataPropertyType = viewDataProperty.PropertyType.GetTypeInfo();
                if (viewDataPropertyType.IsGenericType && viewDataPropertyType.GetGenericTypeDefinition() == typeof(ViewDataDictionary <>))
                {
                    viewDataType = viewDataPropertyType.GetGenericArguments()[0];
                }
            }

            ViewDataDictionary viewData;

            if (viewDataType == null)
            {
                viewData = new ViewDataDictionary <object>(_metadataProvider, _actionContext.ModelState);
            }
            else
            {
                viewData = (ViewDataDictionary)Activator.CreateInstance(typeof(ViewDataDictionary <>).MakeGenericType(viewDataType), _metadataProvider, _actionContext.ModelState);
            }

            var tempData = _tempDataFactory.GetTempData(_actionContext.HttpContext);

            var pageContext = new PageContext(_actionContext, viewData, tempData, _viewOptions.HtmlHelperOptions)
            {
                ActionDescriptor       = _actionDescriptor,
                ValueProviderFactories = _valueProviderFactories,
            };

            var page = (Page)_factory.CreatePage(pageContext);

            var           tempDataPropertyTracker = _tempDataPropertyProvider.LoadAndTrackChanges(page, page.TempData);
            IActionResult result = null;

            var handler = _selector.Select(pageContext);

            if (handler != null)
            {
                var executor = ExecutorFactory.Create(handler.Method);
                result = await executor(page);
            }

            if (result == null)
            {
                result = new PageViewResult(page);
            }

            await result.ExecuteResultAsync(pageContext);

            tempDataPropertyTracker.SaveChanges();
        }
        private async Task ExecutePageAsync()
        {
            var modelType    = _actionDescriptor.ModelType?.AsType();
            var viewDataType = typeof(ViewDataDictionary <>).MakeGenericType(modelType ?? _actionDescriptor.PageType.AsType());

            var viewData = (ViewDataDictionary)Activator.CreateInstance(viewDataType, _metadataProvider, _actionContext.ModelState);

            var tempData = _tempDataFactory.GetTempData(_actionContext.HttpContext);

            var pageContext = new PageContext(_actionContext, viewData, tempData, _viewOptions.HtmlHelperOptions)
            {
                ActionDescriptor       = _actionDescriptor,
                ValueProviderFactories = _valueProviderFactories,
            };

            var page = (Page)_factory.CreatePage(pageContext);

            pageContext.Page = page;

            object model = null;

            if (modelType == null)
            {
                model = page;
            }
            else
            {
                model = _modelFactory.CreateModel(pageContext);
            }

            if (model != null)
            {
                viewData.Model = model;
            }

            var           tempDataPropertyTracker = _tempDataPropertyProvider.LoadAndTrackChanges(page, page.TempData);
            IActionResult result = null;

            var handler = _selector.Select(pageContext);

            if (handler != null)
            {
                var executor = ExecutorFactory.Create(handler.Method);
                result = await executor(page, model);
            }

            if (result == null)
            {
                result = new PageViewResult(page);
            }

            await result.ExecuteResultAsync(pageContext);

            tempDataPropertyTracker.SaveChanges();
        }
Beispiel #3
0
        public void CreateExecutor_ThrowsIfTypeIsNotAValidReturnType(string methodName)
        {
            // Arrange
            var methodInfo = typeof(TestPageModel).GetMethod(methodName);
            var handler    = new HandlerMethodDescriptor()
            {
                MethodInfo = methodInfo,
                Parameters = CreateParameters(methodInfo),
            };

            // Act & Assert
            var ex = Assert.Throws <InvalidOperationException>(() => ExecutorFactory.CreateExecutor(handler));

            Assert.Equal($"Unsupported handler method return type '{methodInfo.ReturnType}'.", ex.Message);
        }
Beispiel #4
0
        private static PageHandlerExecutorDelegate[] GetHandlerExecutors(CompiledPageActionDescriptor actionDescriptor)
        {
            if (actionDescriptor.HandlerMethods == null || actionDescriptor.HandlerMethods.Count == 0)
            {
                return(Array.Empty <PageHandlerExecutorDelegate>());
            }

            var results = new PageHandlerExecutorDelegate[actionDescriptor.HandlerMethods.Count];

            for (var i = 0; i < actionDescriptor.HandlerMethods.Count; i++)
            {
                results[i] = ExecutorFactory.CreateExecutor(actionDescriptor.HandlerMethods[i]);
            }

            return(results);
        }
Beispiel #5
0
        public async Task CreateExecutor_ForMethodReturningConcreteSubtypeOfIActionResult()
        {
            // Arrange
            var handler = new HandlerMethodDescriptor()
            {
                MethodInfo = typeof(TestPage).GetMethod(nameof(TestPage.ConcreteActionResult)),
                Parameters = new HandlerParameterDescriptor[0],
            };

            // Act
            var executor = ExecutorFactory.CreateExecutor(handler);

            // Assert
            Assert.NotNull(executor);
            var actionResultTask = executor(new TestPage(), null);
            var actionResult     = await actionResultTask;

            Assert.IsType <ViewResult>(actionResult);
        }
Beispiel #6
0
        public async Task CreateExecutor_ForTaskOfIActionResultReturningMethod()
        {
            // Arrange
            var methodInfo = typeof(TestPage).GetMethod(nameof(TestPage.GenericTaskHandler));
            var handler    = new HandlerMethodDescriptor()
            {
                MethodInfo = methodInfo,
                Parameters = CreateParameters(methodInfo),
            };

            // Act
            var executor = ExecutorFactory.CreateExecutor(handler);

            // Assert
            Assert.NotNull(executor);
            var actionResultTask = executor(new TestPage(), null);
            var actionResult     = await actionResultTask;

            Assert.IsType <EmptyResult>(actionResult);
        }
Beispiel #7
0
        public async Task CreateExecutor_ForActionResultReturningMethod_WithParameters()
        {
            // Arrange
            var methodInfo = typeof(TestPage).GetMethod(nameof(TestPage.ActionResultReturnHandlerWithParameters));
            var handler    = new HandlerMethodDescriptor()
            {
                MethodInfo = methodInfo,
                Parameters = CreateParameters(methodInfo),
            };

            // Act
            var executor = ExecutorFactory.CreateExecutor(handler);

            // Assert
            Assert.NotNull(executor);
            var actionResultTask = executor(new TestPage(), CreateArguments(methodInfo));
            var actionResult     = await actionResultTask;
            var contentResult    = Assert.IsType <ContentResult>(actionResult);

            Assert.Equal("Hello 0", contentResult.Content);
        }
Beispiel #8
0
        public async Task CreateExecutor_ForVoidReturningMethod()
        {
            // Arrange
            var handler = new HandlerMethodDescriptor()
            {
                MethodInfo = typeof(TestPage).GetMethod(nameof(TestPage.VoidReturningHandler)),
                Parameters = new HandlerParameterDescriptor[0],
            };

            var page = new TestPage();

            // Act
            var executor = ExecutorFactory.CreateExecutor(handler);

            // Assert
            Assert.NotNull(executor);
            var actionResultTask = executor(page, null);
            var actionResult     = await actionResultTask;

            Assert.Null(actionResult);
            Assert.True(page.SideEffects);
        }