public static HtmlString RenderMortarItem(
			this HtmlHelper helper,
			MortarRow row,
			MortarItem item,
			string viewPath = "",
			string actionName = "",
			object model = null)
		{
			if (item == null || item.Value == null)
				return new HtmlString(string.Empty);

			if (!string.IsNullOrWhiteSpace(viewPath))
				viewPath = viewPath.TrimEnd('/') + "/";

			if (string.IsNullOrWhiteSpace(actionName))
				actionName = item.Value.DocumentTypeAlias;

			var controllerName = string.Concat(item.Value.DocumentTypeAlias, "Surface");

			if (SurfaceControllerHelper.SurfaceControllerExists(controllerName, actionName, true))
			{
				return helper.Action(actionName,
					controllerName,
					new
					{
						mortarModel = model ?? item.Value,
						mortarRow = row,
						mortarViewPath = viewPath
					});
			}

			return helper.Partial(viewPath + item.Value.DocumentTypeAlias, model ?? item.Value);
		}
		public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
		{
			if (reader.TokenType == JsonToken.Null)
				return null;

			var tempDictionary = new Dictionary<string, object>();

			serializer.Populate(reader, tempDictionary);

			// Make sure keys are in camelCase
			tempDictionary = tempDictionary
				.ToDictionary(x => char.ToLowerInvariant(x.Key[0]) + x.Key.Substring(1), x => x.Value);

			var item = new MortarItem
			{
				Type = tempDictionary["type"].ToString(),
				RawValue = tempDictionary["value"],
				AdditionalInfo = tempDictionary
					.Where(x => x.Key != "type" && x.Key != "value")
					.ToDictionary(k => k.Key, v => v.Value.ToString())
			};

			return item;
		}
		public RenderMortarItemViewModel(MortarRow row, MortarItem item, int index)
		{
			Index = index;
			Item = item;
			Row = row;
		}