Data Routing for MVC Functions
Use data URL mappers with data items rendered by MVC functions.
When MVC functions are used for rendering data items, registering a data URL mapper will allow synchronization between the tree view and browser view in the CMS Console.
You can registering a data URL mapping for MVC functions in one of the following ways:
- Using the
[DynamicUrlMapping]or[GlobalUrlMapping]attributes for controllers registered with the[C1Function]attribute. - Using
AddUrlMapping(...)when registering controllers on the application startup.
1. Registering mappings with attributes
For MVC functions defined with the [C1Function] attribute, you can use the [DynamicUrlMapper] or [GlobalUrlMapper] attribute on an action method that renders a data item by a certain field.
DynamicUrlMapperregisters a data URL mapper when a page is rendered. Mostly suitable for page folder data.GlobalUrlMapperrequires defining a page id, and is registered globally. Suitable for global data types, that do not contain a reference to a CMS Page.
DynamicUrlMapper:
[DynamicUrlMapper(type)]registers a URL mapping that uses the default "Id" field as the key, for links like:/pageUrl/<action>/<dataid>- [
DynamicUrlMapper(type, "<fieldName>")]- registers a URL mapping that uses a specified field value as the key, for links like:/pageUrl/<action>/<label field>
GlobalUrlMapper:
Similarly GlobalUrlMapper allows associating between a global data type item and urls to a certain page:
[GlobalUrlMapper(type, "<pageid>")][GlobalUrlMapper(type, "<pageid>", "<fieldName>")]
Example
The following is the example of registering an URL mapping for a controller exposed as an MVC function.
A custom data type ICar is used for this example.
Controller:
using System.Linq;
using System.Web.Mvc;
using Composite.AspNet.MvcFunctions;
using Composite.AspNet.MvcFunctions.Routing;
using Composite.Core.Linq;
using Composite.Core.Routing.Foundation.PluginFacades;
using Composite.Data;
namespace Composite.Demo
{
[C1Function(Namespace = "Demo", Name="Car")]
public class CarController: Controller
{
public ActionResult Index()
{
var cars = DataFacade.GetData<ICar>().ToList();
return View(cars);
}
[GlobalUrlMapper(typeof(ICar), "c5383680-45b7-4a96-9f8d-be4910522221")]
public ActionResult Details(string id)
{
var car = DataFacade.GetData<ICar>().FirstOrDefault(p => p.Id == id);
return car == null ? (ActionResult) HttpNotFound() : View(car);
}
[GlobalUrlMapper(typeof(ICar), "c5383680-45b7-4a96-9f8d-be4910522221", "Name")]
public ActionResult DetailsByName(string id)
{
string name = id;
var product = DataFacade.GetData<ICar>().Evaluate().FirstOrDefault(p => LabelToUrlPart(p.Name) == name);
return product == null ? (ActionResult)HttpNotFound() : View("Details", product);
}
private static string LabelToUrlPart(string partnerName)
{
return UrlFormattersPluginFacade.FormatUrl(partnerName, true);
}
}
}
Make sure to register your controller as an auto-discovered MVC Function.
Show the sample startup handler code for CarController
You should also create corresponding views in /Views on your website.
Views:
- ~/Views/Car/Index.cshtml
@model IEnumerable<Composite.Demo.ICar>
@if (Model != null)
{
<h1> List of cars: </h1>
foreach (var product in Model)
{
<div>
@Html.ActionLink(product.Name, "Details", new {id = product.Id})
</div>
}
}
- ~/Views/Car/Details.cshtml
@model Composite.Demo.ICar
<h1>Car information:</h1>
<p>
Model: <strong>@Model.Name</strong>
</p>
<p>
@Model.Description
</p>
<br />
<p>
@Html.ActionLink("Go back", "Index")
</p>2. Adding data URL mappers for controllers registered as functions
If you choose to register your controllers on the application startup, you can add data URL mappings with a call to the extension method AddUrlMapping.
For example, for a link like <pageUrl>/details/{id}, the call would be:
functionCollection.RegisterController<ProductController>("Demo.Product")
.AddUrlMapping<Product>(new Guid("3a613405-9990-47a6-8f00-672a8e6de9e7"), "details");For controller-based MVC functions, you have to manually specify action name if it appears in URLs.
For action-based MVC functions (defined with the RegisterAction method), you don't need to specify the action name for data URL handling.
Requirements
- C1 CMS version 5.0 or later

