diff --git a/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/DnnController.cs b/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/DnnController.cs index 236f93f43f4..1de35e6b0af 100644 --- a/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/DnnController.cs +++ b/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/DnnController.cs @@ -4,6 +4,7 @@ using System; using System.Text; using System.Web.Mvc; +using System.Web.Routing; using System.Web.UI; using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Modules.Actions; @@ -14,6 +15,7 @@ using DotNetNuke.UI.Modules; using DotNetNuke.Web.Mvc.Framework.ActionResults; using DotNetNuke.Web.Mvc.Framework.Modules; +using DotNetNuke.Web.Mvc.Helpers; namespace DotNetNuke.Web.Mvc.Framework.Controllers { @@ -36,6 +38,8 @@ public TabInfo ActivePage public Page DnnPage { get; set; } + public new DnnUrlHelper Url { get; set; } + public string LocalResourceFile { get; set; } public string LocalizeString(string key) @@ -119,6 +123,12 @@ protected override PartialViewResult PartialView(string viewName, object model) }; } + protected override void Initialize(RequestContext requestContext) + { + base.Initialize(requestContext); + Url = new DnnUrlHelper(requestContext, this); + } + public ViewEngineCollection ViewEngineCollectionEx { get; set; } } } \ No newline at end of file diff --git a/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/IDnnController.cs b/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/IDnnController.cs index df39e8ece5f..77eefdb18a7 100644 --- a/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/IDnnController.cs +++ b/DNN Platform/DotNetNuke.Web.Mvc/Framework/Controllers/IDnnController.cs @@ -5,6 +5,7 @@ using System.Web.UI; using DotNetNuke.Entities.Modules.Actions; using DotNetNuke.UI.Modules; +using DotNetNuke.Web.Mvc.Helpers; namespace DotNetNuke.Web.Mvc.Framework.Controllers { @@ -28,5 +29,7 @@ public interface IDnnController : IController ViewEngineCollection ViewEngineCollectionEx { get; set; } + DnnUrlHelper Url { get; set; } + } } diff --git a/DNN Platform/DotNetNuke.Web.Mvc/Helpers/DnnUrlHelper.cs b/DNN Platform/DotNetNuke.Web.Mvc/Helpers/DnnUrlHelper.cs index 3492b810b67..7fbecd11564 100644 --- a/DNN Platform/DotNetNuke.Web.Mvc/Helpers/DnnUrlHelper.cs +++ b/DNN Platform/DotNetNuke.Web.Mvc/Helpers/DnnUrlHelper.cs @@ -22,6 +22,16 @@ public DnnUrlHelper(ViewContext viewContext) { } + public DnnUrlHelper(RequestContext requestContext, IDnnController controller) + { + Requires.NotNull("requestContext", requestContext); + Requires.NotNull("controller", controller); + + UrlHelper = new UrlHelper(requestContext); + _controller = controller; + ModuleContext = _controller.ModuleContext; + } + public DnnUrlHelper(ViewContext viewContext, RouteCollection routeCollection) { Requires.NotNull("viewContext", viewContext); @@ -77,7 +87,7 @@ public virtual bool IsLocalUrl(string url) public virtual string Action() { - return _viewContext.RequestContext.HttpContext.Request.RawUrl; + return UrlHelper.RequestContext.HttpContext.Request.RawUrl; } public virtual string Action(string actionName) diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Fakes/FakeDnnController.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Fakes/FakeDnnController.cs index 307ff2f32c2..48e1828467c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Fakes/FakeDnnController.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Fakes/FakeDnnController.cs @@ -22,8 +22,8 @@ #endregion using System.Web.Mvc; -using System.Web.UI.WebControls; using DotNetNuke.Web.Mvc.Framework.Controllers; +using System.Web.Routing; namespace DotNetNuke.Tests.Web.Mvc.Fakes { @@ -43,5 +43,13 @@ public ActionResult Action3(Dog dog) { return View("Action3", "Master3", dog); } + + public void MockInitialize(RequestContext requestContext) + { + // Mocking out the entire MvcHandler and Controller lifecycle proved to be difficult + // This method executes the initialization logic that occurs on every request which is + // executed from the Execute method. + Initialize(requestContext); + } } } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Controllers/DnnControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Controllers/DnnControllerTests.cs index 0983e31967a..c744099fa9c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Controllers/DnnControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Controllers/DnnControllerTests.cs @@ -164,6 +164,20 @@ public void View_Returns_DnnViewResult_With_Correct_ViewEngines() Assert.AreEqual(controller.ViewEngineCollection, dnnViewResult.ViewEngineCollection); } + [Test] + public void Initialize_CreatesInstance_Of_DnnUrlHelper() + { + //Arrange + HttpContextBase httpContextBase = MockHelper.CreateMockHttpContext(); + + //Act + var controller = SetupController(httpContextBase); + controller.MockInitialize(httpContextBase.Request.RequestContext); + + //Assert + Assert.NotNull(controller.Url); + } + private FakeDnnController SetupController(HttpContextBase context) { var controller = new FakeDnnController(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Helpers/DnnUrlHelperTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Helpers/DnnUrlHelperTests.cs index 880243bb91f..54b9ad82739 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Helpers/DnnUrlHelperTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Helpers/DnnUrlHelperTests.cs @@ -52,6 +52,20 @@ public void Constructor_Throws_On_Null_ViewContext() Assert.Throws(() => new DnnUrlHelper(null)); } + [Test] + public void Constructor_Throws_On_Null_RequestContext() + { + //Act,Assert + Assert.Throws(() => new DnnUrlHelper(null, new Mock().Object)); + } + + [Test] + public void Constructor_Throws_On_Null_Controller() + { + //Act,Assert + Assert.Throws(() => new DnnUrlHelper(new Mock().Object, null)); + } + [Test] public void Constructor_Throws_On_Invalid_Controller_Property() { @@ -64,7 +78,7 @@ public void Constructor_Throws_On_Invalid_Controller_Property() } [Test] - public void Constructor_Sets_ModuleContext_Property() + public void ViewContext_Constructor_Sets_ModuleContext_Property() { //Arrange var mockController = new Mock(); @@ -80,6 +94,58 @@ public void Constructor_Sets_ModuleContext_Property() Assert.AreEqual(expectedContext, helper.ModuleContext); } + [Test] + public void RequestContext_Constructor_Sets_ModuleContext_Property() + { + //Arrange + var expectedContext = new ModuleInstanceContext(); + + var mockController = new Mock(); + mockController.SetupGet(c => c.ModuleContext) + .Returns(expectedContext); + + var requestContext = new RequestContext(); + + //Act + var helper = new DnnUrlHelper(requestContext, mockController.Object); + + //Assert + Assert.NotNull(helper); + Assert.AreEqual(expectedContext, helper.ModuleContext); + } + + [Test] + public void Action_Method_ViewContext_RetrievesRawUrl() + { + //Arrange + var expectedContext = new ModuleInstanceContext(); + var rawUrl = "http://base.url/"; + var helper = ArrangeHelper(expectedContext, rawUrl); + + //Act + var result = helper.Action(); + + //Assert + Assert.NotNull(result); + Assert.AreEqual(rawUrl, result); + } + + [Test] + public void Action_Method_RequestContext_RetrievesRawUrl() + { + //Arrange + var expectedContext = new ModuleInstanceContext(); + var rawUrl = "http://base.url/"; + var helper = ArrangeHelper(expectedContext, rawUrl, false); + + //Act + var result = helper.Action(); + + //Assert + Assert.NotNull(result); + Assert.AreEqual(rawUrl, result); + } + [Test] public void Action_Method_Calls_ModuleRouteProvider() { @@ -242,7 +308,7 @@ public void GenerateUrl_Method_Passes_Correct_RouteValueCollection_To_ModuleRout Assert.AreEqual(5, (int)routeValues["id"]); } - private static DnnUrlHelper ArrangeHelper(ModuleInstanceContext expectedContext, string url = null) + private static DnnUrlHelper ArrangeHelper(ModuleInstanceContext expectedContext, string url = null, bool isViewContext = true) { var mockController = new Mock(); var mockDnnController = mockController.As(); @@ -255,12 +321,18 @@ private static DnnUrlHelper ArrangeHelper(ModuleInstanceContext expectedContext, mockDnnController.Setup(c => c.ModuleContext).Returns(expectedContext); mockDnnController.Setup(c => c.ControllerContext).Returns(context); - var viewContext = new ViewContext { Controller = mockController.Object }; + if (isViewContext) + { + var viewContext = new ViewContext { Controller = mockController.Object }; + + if (!string.IsNullOrEmpty(url)) + viewContext.RequestContext = new RequestContext(MockHelper.CreateMockHttpContext(url), routeData); - if (!string.IsNullOrEmpty(url)) - viewContext.RequestContext = new RequestContext(MockHelper.CreateMockHttpContext(url), routeData); + return new DnnUrlHelper(viewContext); + } - return new DnnUrlHelper(viewContext); + var requestContext = new RequestContext(MockHelper.CreateMockHttpContext(url ?? "http://base/"), routeData); + return new DnnUrlHelper(requestContext, mockDnnController.Object); } } } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/MockHelper.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/MockHelper.cs index fa7e628226f..29cd7c2777c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/MockHelper.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/MockHelper.cs @@ -47,6 +47,8 @@ public static HttpContextBase CreateMockHttpContext(Dictionary i var mockRequest = new Mock(); mockRequest.Setup(r => r.QueryString) .Returns(new NameValueCollection()); + mockRequest.Setup(r => r.RequestContext) + .Returns(new RequestContext()); var mockResponse = new Mock(); @@ -54,7 +56,7 @@ public static HttpContextBase CreateMockHttpContext(Dictionary i .Returns(mockRequest.Object); mockContext.SetupGet(c => c.Response) .Returns(mockResponse.Object); - + return mockContext.Object; }