Our company supports the Real Estate industry and I an trying to create a page in Umbraco that load the details of the listing from an id passed in the url. I have tried several examples so far and am lost as to what the missing piece is. The data is retrieved from an external MLS database via a REST API.
For my Controller, I have tried RenderMvcController, SurfaceController, and PluginController. It currently looks like this:
public class PropertyController : Umbraco.Web.Mvc.PluginController
{
public PropertyController()
: this(UmbracoContext.Current)
{
}
public PropertyController(UmbracoContext umbracoContext)
: base(umbracoContext)
{
}
public ActionResult Index(string propertyID)
{
dbzBest.Models.PropertyDetails p = new dbzBest.Models.PropertyDetails();
umbraco.NodeFactory.Node node = umbraco.uQuery.GetNodesByName("real-estate").FirstOrDefault();
IPublishedContent currentNode = Umbraco.Content(node.Id);
p = zbdLibrary.GlobalFunctions.zbdAPI("property/GetDetails/" + propertyID).jsonToEntity<dbzBest.Models.PropertyDetails>();
//***Using this line returns page as expected, but no info on the property. I get null errors with out it.
//return View("real-estate", CreateRenderModel(currentNode));
//this line fails. How do I pass this data to the view?
return View("real-estate", p);
}
private RenderModel CreateRenderModel(IPublishedContent content)
{
var model = new RenderModel(content, CultureInfo.CurrentUICulture);
//add an umbraco data token so the umbraco view engine executes
RouteData.DataTokens["umbraco"] = model;
return model;
}
}
The MapUmbracoRoute needs to have associated an IPublishedContent item...
I would normally create a ProductsSectionPage in Umbraco and use that
You can create your own logic for finding that content item with your own VirtualNodeRoteHandler and implementing TryFindContent... Or you can use the one in the example shipped with Umbraco that will find content by id
With thst in place your controller should inherit RenderMVCController and have an index action that takes a RenderModel content parameter along with your id
This content item will be the IPublishedContent item you associated in MapUmbracoRoute...
You can create your own custom view model that inherits from RenderModel and populate it with your products properties using the Id to pull data from your external source...
Pass your populated view model to your View... And at the top of your view have
@inherits UmbracoViewPage<YourViewModel>
Your view can then share its master layout with the rest of your site without error...
Any common implementation from the rest of your site like breadcrumbs will use the ProductsSectionPage as context...
How to pass data to view from an external source
Our company supports the Real Estate industry and I an trying to create a page in Umbraco that load the details of the listing from an id passed in the url. I have tried several examples so far and am lost as to what the missing piece is. The data is retrieved from an external MLS database via a REST API.
I have a custom route that looks like this:
For my Controller, I have tried RenderMvcController, SurfaceController, and PluginController. It currently looks like this:
Can someone please tell me what I am missing?
Thanks
Hi Graham
The problem here is your Umbraco specific controllers need the context of an IPublishedContent item to accompany the routing...
There is a special way to map such a route through umbraco using "MapUmbracoRoute' instead of 'MapRoute'...
Example here: https://our.umbraco.com/Documentation/Reference/Routing/custom-routes-v7#custom-routes-within-the-umbraco-pipeline
The MapUmbracoRoute needs to have associated an IPublishedContent item...
I would normally create a ProductsSectionPage in Umbraco and use that
You can create your own logic for finding that content item with your own VirtualNodeRoteHandler and implementing TryFindContent... Or you can use the one in the example shipped with Umbraco that will find content by id
With thst in place your controller should inherit RenderMVCController and have an index action that takes a RenderModel content parameter along with your id
This content item will be the IPublishedContent item you associated in MapUmbracoRoute...
You can create your own custom view model that inherits from RenderModel and populate it with your products properties using the Id to pull data from your external source...
Pass your populated view model to your View... And at the top of your view have
@inherits UmbracoViewPage<YourViewModel>
Your view can then share its master layout with the rest of your site without error...Any common implementation from the rest of your site like breadcrumbs will use the ProductsSectionPage as context...
Regards
Marc
is working on a reply...