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(); }
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); }
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); }
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); }
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); }
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); }
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); }