From 8ddf11469bfac0f2b941163307ea61ffaf7c3cfb Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Date: Wed, 3 Aug 2016 09:31:58 -0700 Subject: [PATCH] Checking in update to documentation regarding setting the View Path --- docs/SolutionOverview.rst | 174 +++++++++++++++++++++++++- docs/images/ContentFolderContents.jpg | Bin 0 -> 20982 bytes 2 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 docs/images/ContentFolderContents.jpg diff --git a/docs/SolutionOverview.rst b/docs/SolutionOverview.rst index 2659b33..d6494da 100644 --- a/docs/SolutionOverview.rst +++ b/docs/SolutionOverview.rst @@ -96,9 +96,181 @@ Using the BaseViewModel Using the ViewPath Property """"""""""""""""""""""""""" +Using the Ignition Framework, we have variety of methods in our disposal for setting the view path to find the view. The methods of setting the view path which will be discussed in more detail will be… -.. _Creating-a-Custom-ViewModel: +1. Inherit folder structure +2. Within the View Model itself +3. Using the View Agent +4. Using Agent Parameters + +**Inherit Folder Structure** + +The Ignition framework is based on .NET MVC framework architecture. Following MVC convention, if the controller .cs file is located within a folder under the Components folder with the same name and the action result controller call matches the name of the view which it is designed to render, then no additional code is required. + +As an example, underneath the Components folder there is a content folder which contains the controller named ContentController.cs. This controller references three views which resides in the same folder. + +.. image:: images/ContentFolderContents.jpg + :scale: 35 + :align: center + +These files are contained within this folder structure so when the controller calls are performed the view path does not need to be explicitly stated. It is inferred from the action result name and folder structure it is held within. For instance, the controller code which reference these views is shown below. Note that the controller calls below while calling Ignition’s View method does not reference an actual view outside of the ActionResult name. :: + + public ActionResult ContentBlurbView() + { + return View(); + } + public ActionResult ContentBlurbViewTwo() + { + return View(); + } + + public ActionResult ContentBlurbViewThree() + { + return View(); + } + +In addition, the view model supporting these Sitecore component views makes no direct reference to a view path used to find the view within the folder structure of the project as shown below. :: + + using Ignition.Core.Mvc; + using Ignition.Data.Fields; + + namespace Ignition.Sc.Components.Content + { + public class ContentBlurbViewModel : BaseViewModel + { + public IHeading Heading { get; set; } + public ISubtitle Subtitle { get; set; } + public IRichContent1 RichText1 { get; set; } + public string HeadingPosition { get; set; } + } + } + +**Within the View Model Itself** + +If we look at the BaseViewModel inherited by the view models of the Ignition framework, it contains a property named ViewPath which can be used to dynamically set the file location of the view the model will populate. :: + + using Ignition.Core.Models.Page; + + namespace Ignition.Core.Mvc + { + public class BaseViewModel + { + public virtual string ViewPath { get; set; } + public IPage ContextPage { get; set; } + public string ParentPlaceholderName { get; set; } + public bool UseWrapper { get; set; } + } + } + +If the view model, is only going to be used by one view, then the view path can be set within the view model itself. For instance, if for the ContentBlurbViewModel, the plan is to only use one ContentBlurbView.cshtml file then you can set the view path value within the view model itself. This is an option when rendering the view doesn’t involve using a view agent. Also, by coding it directly, the name and location of the view in relation to the model and the controller does not play a role. Note that the reference to the view path is passed it by using a constant defined within the project and not passing in a string directly. :: + + using Ignition.Core.Mvc; + using Ignition.Data.Fields; + + namespace Ignition.Sc.Components.Content + { + public class ContentBlurbViewModel : BaseViewModel + { + public IHeading Heading { get; set; } + public ISubtitle Subtitle { get; set; } + public IRichContent1 RichText1 { get; set; } + public string HeadingPosition { get; set; } + + public override string ViewPath { get; set; } = IgnitionConstants.ContentViews.ContentBlurbView; + + } + } + +**Using the View Agent** + +If there is some logic involved with dynamically determining the view path of a view, then the proper place in code to set this would be through the view agent. + +Within the view agent you have access to the view model before its content is rendered by the view including the view path which determines which view file to render. An example of setting the view path using the PopulateMethod method of the view agent code is shown below. :: + + using Ignition.Core.Mvc; + + namespace Ignition.Sc.Components.Content + { + public class ContentBlurbAgent : Agent + { + public override void PopulateModel() + { + var parameters = RenderingParameters as IContentBlurbParams; + + if (parameters == null) return; + ViewModel.HeadingPosition = parameters.Position?.StringSetting; + + var datasource = Datasource as IContentBlurb; + if (datasource == null) return; + ViewModel.Heading = datasource; + ViewModel.Subtitle = datasource; + ViewModel.RichText1 = datasource; + + ViewModel.ViewPath = IgnitionConstants.ContentViews.ContentBlurbView; + } + } + } + +Through this PopulateModel method, the developer can either create sophisticated logic with the same agent to set the proper view path based on which component needs to be serviced in Sitecore or for instance, develop a unique agent for each component re-using the same view model where the view path is set through each individual agent. + +**Agent Parameters Can Help** + +Another mechanism which can be used to create sophisticated logic to determine the proper view path is an agent parameter which can be passed from the controller call to the PopulateModel method of the agent. The first step would be to create an agent parameter class used to capture information through an object which would be passed to the agent through the controller. An example is shown below. :: + + namespace Ignition.Sc.Components.Content + { + public class ContentBlurbParams + { + public string Params1 { get; set; } + public string Params2 { get; set; } + public string Params3 { get; set; } + } + } + +The next step would involve create an instance of the object during the controller call to include data which can be used to drive sophisticated logic within the agent. An example of that is shown below. :: + + using System.Web.Mvc; + using Ignition.Core.Mvc; + using Ignition.Core.Repositories; + + namespace Ignition.Sc.Components.Content + { + public class ContentController : IgnitionController + { + public ContentController(ItemContext context) : base(context) + { + } + + public ActionResult ContentBlurbView() + { + return View(new ContentBlurbParams + { + Params1 = "First Parameter", + Params2 = "Second Parameter", + Params3 = "Third Parameter" + }); + } + } + } + +During the agent’s PopulateModel method call, the agent parameter would be accessed by casting the incoming agent parameter object (AgentParameters) to the class used to define it in the controller as shown below. At that point, each object property is available and the developer can then use this data to drive the logic of the agent trying to determine what functionality to invoke including which view to render. :: + + using Ignition.Core.Mvc; + + namespace Ignition.Sc.Components.Content + { + public class ContentBlurbAgent : Agent + { + public override void PopulateModel() + { + var agentParameters = AgentParameters as ContentBlurbParams; + var FirstParameter = agentParameters?.Params1; + } + } + } + +.. _Creating-a-Custom-ViewModel: Creating a Custom ViewModel ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/images/ContentFolderContents.jpg b/docs/images/ContentFolderContents.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a725d7dd13efccf8bf43639ba6c217b97d285604 GIT binary patch literal 20982 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