From 94fa34ca41f32ed2a503f7af78b86fa921b72c78 Mon Sep 17 00:00:00 2001 From: Shahriar Gholami Date: Fri, 17 Jun 2016 21:45:50 +0430 Subject: [PATCH] TempData convenience property added to ViewComponent (#4873) * TempData convenience property added to ViewComponent #4728 * PR feedback --- .../ViewComponent.cs | 11 +++ .../ViewComponents/ViewComponentContext.cs | 8 ++ .../ViewComponentTests.cs | 74 +++++++++++++++++++ .../ViewComponentContextTest.cs | 5 +- 4 files changed, 97 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs index 5315038586..b287c4fba3 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponent.cs @@ -172,6 +172,17 @@ namespace Microsoft.AspNetCore.Mvc } } + /// + /// Gets the . + /// + public ITempDataDictionary TempData + { + get + { + return ViewComponentContext.TempData; + } + } + /// /// Gets or sets the . /// diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs index 0ef48b50d1..32e4fbd338 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewComponents/ViewComponentContext.cs @@ -122,6 +122,14 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents /// public ViewDataDictionary ViewData => ViewContext.ViewData; + /// + /// Gets the . + /// + /// + /// This is an alias for ViewContext.TempData. + /// + public ITempDataDictionary TempData => ViewContext.TempData; + /// /// Gets the for output. /// diff --git a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponentTests.cs b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponentTests.cs index 7c64a74e52..36caea39e9 100644 --- a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponentTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponentTests.cs @@ -1,8 +1,14 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; +using System.Linq; using System.Text.Encodings.Web; +using System.Threading.Tasks; using Microsoft.AspNetCore.Html; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewComponents; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Xunit; @@ -144,6 +150,7 @@ namespace Microsoft.AspNetCore.Mvc // ViewComponent.ViewContext returns the default instance for the unit test scenarios Assert.NotNull(viewComponent.ViewContext); Assert.NotNull(viewComponent.ViewContext.ViewData); + Assert.Null(viewComponent.ViewContext.TempData); // ViewComponent.ViewData returns the default instance for the unit test scenarios Assert.Empty(viewComponent.ViewContext.ViewData); @@ -152,8 +159,75 @@ namespace Microsoft.AspNetCore.Mvc Assert.Same(viewComponent.ViewData, viewComponent.ViewContext.ViewData); } + [Fact] + public void ViewComponent_ViewContext_TempData_ReturnsDefaultInstanceIfSessionActive() + { + // Arrange + var httpContext = new DefaultHttpContext(); + httpContext.Features.Set(new SessionFeature() { Session = new TestSession() }); + var viewContext = new ViewContext(); + viewContext.TempData = new TempDataDictionary(httpContext, new SessionStateTempDataProvider()); + var viewComponentContext = new ViewComponentContext(); + viewComponentContext.ViewContext = viewContext; + + // Act + var viewComponent = new TestViewComponent(); + viewComponent.ViewComponentContext = viewComponentContext; + + // Assert + Assert.NotNull(viewComponent.ViewContext.TempData); + Assert.Empty(viewComponent.ViewContext.TempData); + Assert.Same(viewComponent.TempData, viewComponent.ViewContext.TempData); + } + private class TestViewComponent : ViewComponent { } + + private class SessionFeature : ISessionFeature + { + public ISession Session { get; set; } + } + + private class TestSession : ISession + { + private Dictionary _innerDictionary = new Dictionary(); + + public IEnumerable Keys { get { return _innerDictionary.Keys; } } + + public string Id => "TestId"; + + public bool IsAvailable { get; } = true; + + public Task LoadAsync() + { + return Task.FromResult(0); + } + + public Task CommitAsync() + { + return Task.FromResult(0); + } + + public void Clear() + { + _innerDictionary.Clear(); + } + + public void Remove(string key) + { + _innerDictionary.Remove(key); + } + + public void Set(string key, byte[] value) + { + _innerDictionary[key] = value.ToArray(); + } + + public bool TryGetValue(string key, out byte[] value) + { + return _innerDictionary.TryGetValue(key, out value); + } + } } } diff --git a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponents/ViewComponentContextTest.cs b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponents/ViewComponentContextTest.cs index 8f8cbc7c3e..9d0709e0ce 100644 --- a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponents/ViewComponentContextTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/ViewComponents/ViewComponentContextTest.cs @@ -25,11 +25,12 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents var httpContext = new DefaultHttpContext(); var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider()); + var tempData = new TempDataDictionary(httpContext, new SessionStateTempDataProvider()); var viewContext = new ViewContext( actionContext, NullView.Instance, viewData, - new TempDataDictionary(httpContext, new SessionStateTempDataProvider()), + tempData, TextWriter.Null, new HtmlHelperOptions()); @@ -46,11 +47,13 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents // Assert // New ViewContext but initial View and TextWriter copied over. Assert.NotSame(viewContext, viewComponentContext.ViewContext); + Assert.Same(tempData, viewComponentContext.TempData); Assert.Same(viewContext.View, viewComponentContext.ViewContext.View); Assert.Same(viewContext.Writer, viewComponentContext.ViewContext.Writer); // Double-check the convenience properties. Assert.Same(viewComponentContext.ViewContext.ViewData, viewComponentContext.ViewData); + Assert.Same(viewComponentContext.ViewContext.TempData, viewComponentContext.TempData); Assert.Same(viewComponentContext.ViewContext.Writer, viewComponentContext.Writer); // New VDD instance but initial ModelMetadata copied over.