[ELMA3] Добавление ссылки на карточку справочника
В системе имеется возможность добавить ссылки для объекта, реализовать возможность перехода на карточку объекта.
В примере показана реализация точки расширения для объекта IMyObject, созданного в модуле, который содержит базовый набор свойств и одно свойство типа Выпадающий список. Для данного объекта реализованы переходы на карточку объекта из таблицы со списком записей справочника.
В системе существует две точки расширения для создания ссылок на объект: IEntityLink, IObjectLink. В данной статье будут рассмотрены обе точки расширения.
Пример отображения данных

Рис. 1. Ссылка на карточку объекта из таблицы с контрагентами

Рис. 2. Карточка объекта
Методы расширения (интерфейса) IEntityLink
Точка расширения (интерфейс) IEntityLink имеет следующие методы:
/// <summary>
/// Тип сущности
/// </summary>
Type EntityType { get; }
/// <summary>
/// Идентификатор типа сущности
/// </summary>
Guid TypeUid { get; }
/// <summary>
/// Область
/// </summary>
string Area(IEntity entity);
/// <summary>
/// Действие
/// </summary>
string Action(IEntity entity);
/// <summary>
/// Котроллер
/// </summary>
string Controller(IEntity entity);
/// <summary>
/// Имя парметра id в методе
/// </summary>
string IdParam { get; }
/// <summary>
/// Дополнительный параметры
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
RouteValueDictionary GetParams(IEntity entity);
/// <summary>
/// Готовая ссылка
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
string Href(RequestContext html, IEntity entity);
/// <summary>
/// Загрузить сущность по TypeUid и Id если null
/// </summary>
bool LoadEntityIfNull { get; }
Пример класса точки расширения
[Component]
public class EntityLinkExtension : IEntityLink
{
public Type EntityType
{
get { return typeof(IMyObject); }
}
public Guid TypeUid
{
get { return Guid.Empty; }
}
public string Area(IEntity entity)
{
return null;
}
public string Action(IEntity entity)
{
return null;
}
public string Controller(IEntity entity)
{
return null;
}
public string IdParam
{
get { return null; }
}
public RouteValueDictionary GetParams(IEntity entity)
{
return null;
}
public string Href(RequestContext html, IEntity entity)
{
var urlHelper = new UrlHelper(html);
return urlHelper.Action("Entity", "Home", new { area = EntityLink.Web.RouteProvider.AreaName, id = entity.GetId().ToString() });
}
public bool LoadEntityIfNull
{
get { return true; }
}
}
Данную точку расширения (IEntityLink) лучше использовать при работе с объектами системы ELMA, по сравнению с IObjectLink. IObjectLink лучше использовать для объектов извне.
Метод возвращает ссылку на объект формата
/Ваш_Модуль/Название_Контроллера/Действие_в_контроллере/Идентификатор_Объекта
В данном примере ссылка имеет вид: /EntityLink.Web/Home/Entity/1
Код контроллера HomeController.cs :
public ActionResult Entity(long id)
{
var model = EntityManager<IMyObject>.Instance.LoadOrNull(id);
return View(model);
}
Первое действие контроллера возвращает представление ViewItem.cshtml с моделью объекта IMyObject.
В данном примере использована таблица со списком объектов, наименования которых являются ссылками и ведут на карточку этого объекта, которая представлена при помощи представления ViewItem.cshtml.
Пример отображения карточки объекта в ViewItem.cshtml:
@model IMyObject
@using EleWise.ELMA.Model.Services
@using EleWise.ELMA.Web.Mvc.ExtensionPoints
@using EleWise.ELMA;
@using EntityLink.Models
@{
Html.Header(SR.T("Мой объект"));
}
@(Html.Toolbar("toolbar").Group("toolbar-group-1")
.ToolbarLink(SR.Back, "#x32/Prev.png", "javascript:history.back(-1);", "toolbar-action-Back")
)
@using (Html.ElmaForm())
{
@Html.TableFormStart()
@Html.DisplayFor(m => m, "Object")
@Html.TableFormEnd()
}
Главное отличие IEntityLink от IObjectLink в том, что IEntityLink можно использовать только для объектов системы (сущностей), тогда как IObjectLink можно использовать практически для всех объектов системы (сущности, перечисления…). Стоит отметить, что IEntityLink имеет более гибкие настройки, в отличие от IObjectLink. В примере при реализации IObjectLink будет создана ссылка для пользовательского события в календаре IDelivery, тогда как реализовать данную ссылку при помощи IEntityLink невозможно. Подробнее о создании собственных событий в календаре можно прочитать в следующей статье.
Пример отображения данных

Рис. 3. Сгенерированная ссылка на событие в календаре
Методы расширения (интерфейса) IObjectLink
Точка расширения (интерфейс) IObjectLink имеет следующие методы:
- public bool CheckType(Type type) – определяет тип объекта, для которого предназначено данное расширение, в качестве параметра передается объект.
- public string Url(RequestContext context, object obj) – возвращает строку, содержащую адрес до объекта.
Пример класса точки расширения
[Component]
public class ObjectLinkExtension : IObjectLink
{
public bool CheckType(Type type)
{
return type.IsInheritOrSame<DeliveryCalendarItem>();
}
public string Url(RequestContext context, object obj)
{
var urlHelper = new UrlHelper(context);
return urlHelper.Action("ViewItem", "Catalogs", new
{
area = EleWise.ELMA.BPM.Web.Common.RouteProvider.AreaName,
id = ((DeliveryCalendarItem)obj).Id,
uid = InterfaceActivator.UID<IDelivery>()
});
}
}
Метод возвращает ссылку на запись в справочнике. При желании можно реализовать собственное отображение атрибутов объекта IDelivery.