Skip to content

Instantly share code, notes, and snippets.

@willprice76
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save willprice76/96ab159941c774a283e7 to your computer and use it in GitHub Desktop.
Save willprice76/96ab159941c774a283e7 to your computer and use it in GitHub Desktop.
Example Tridion Reference Implementation Data Controller
using Sdl.Web.Common.Interfaces;
using Sdl.Web.Common.Logging;
using Sdl.Web.Common.Models;
using Sdl.Web.Mvc.Controllers;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace Example.Site
{
public class DataController : BaseController
{
public DataController(IContentProvider contentProvider, IRenderer renderer)
{
ContentProvider = contentProvider;
Renderer = renderer;
}
public virtual ActionResult Data(string pageUrl, string region)
{
ModelType = ModelType.Page;
var page = ContentProvider.GetPageModel(pageUrl);
var data = new List<object>();
if (page != null)
{
var model = ProcessModel(page, typeof(WebPage)) as WebPage;
var regionToProcess = GetRegion(model, region);
if (regionToProcess!=null)
{
foreach (var cp in regionToProcess.Items)
{
ModelType = ModelType.Entity;
var entity = GetEntity(cp, Request.RequestContext.HttpContext);
if (entity != null)
{
data.Add(entity);
}
}
}
else
{
data.Add(String.Format("No content found on page {0} in region {1}", pageUrl, region));
}
}
else
{
data.Add(String.Format("No content found matching URL {0}", pageUrl));
}
return Json(data , JsonRequestBehavior.AllowGet);
}
private IRegion GetRegion(WebPage model, string region)
{
foreach (var regionName in model.Regions.Keys)
{
if (regionName.ToLower() == region.ToLower())
{
return model.Regions[regionName];
}
}
return null;
}
public object GetEntity(object entity, HttpContextBase context )
{
var mvcData = GetViewData(entity);
var tempRequestContext = new RequestContext(context, new RouteData());
tempRequestContext.RouteData.DataTokens["Area"] = mvcData.ControllerAreaName;
tempRequestContext.RouteData.Values["controller"] = mvcData.ControllerName;
tempRequestContext.RouteData.Values["area"] = mvcData.ControllerAreaName;
BaseController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(tempRequestContext, mvcData.ControllerName) as BaseController;
if (controller!=null)
{
controller.ControllerContext = new ControllerContext(context, tempRequestContext.RouteData, controller);
MethodInfo methodInfo = controller.GetType().GetMethod(mvcData.ActionName ?? "Entity");
if (methodInfo != null)
{
ParameterInfo[] parameters = methodInfo.GetParameters();
object[] parametersArray = new object[] { entity, 0 };
var result = methodInfo.Invoke(controller, parametersArray) as ViewResult;
return result.ViewData.Model;
}
}
return null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment