повторное использование представления с несколькими моделями в Sitecore MVC с использованием GlassMapper

У меня возникли проблемы с определением того, как я могу повторно использовать представления в своем решении sitecore 8 с помощью GlassMapper. У меня есть два объекта, которые содержат одни и те же данные, но поля называются по-разному в зависимости от шаблона. Название против заголовка, например.

Это относительно просто, когда редактор страницы не является фактором, поскольку я могу просто сопоставить/преобразовать один объект в другой, но это, кажется, забивает редактор страницы.

Самый очевидный путь — использовать интерфейсы и методы расширения, как описано здесь, но для этого нужно создать настоящая кухонная раковина интерфейса.

Любые другие предложения? Я бы не хотел копировать представление только для того, чтобы изменить используемые им свойства.


person Rob Allen    schedule 27.08.2015    source источник
comment
Возможно, вам нужно переосмыслить свои шаблоны, если данные одинаковы, затем выделить их в базовый шаблон, а затем использовать наследование шаблонов. Затем вы можете иметь один класс, представляющий данные.   -  person jammykam    schedule 28.08.2015
comment
не спорю, но не вариант на самом деле. Вопрос также более общий, возможно, один элемент имеет общую ссылку, где другой элемент ссылается на себя.   -  person Rob Allen    schedule 28.08.2015


Ответы (3)


Если вы используете рендеринг контроллера, вы можете определить такой интерфейс:

public interface ITitleAndBody : IGlassBase 
{
    string Title  {get; set;}
    string Body  {get; set;}
}

И конкретные типы, такие как:

public class MyType1 : GlassBase, ITitleAndBody 
{
    [SitecoreField("Title")]
    public virtual int Title  {get; set;}

    [SitecoreField("Body")]
    public virtual string Body  {get; set;}
}

public class MyType2 : MyType1
{
    [SitecoreField("Header")]
    public override int Title  {get; set;}
}

Вам понадобятся два действия контроллера, указывающие на одно и то же представление:

public ActionResult MyType1()
{
    return PartialView("/Views/MyView.cshtml", SitecoreContext.GetCurrentItem<MyType1>());
}

public ActionResult MyType2()
{
    return PartialView("/Views/MyView.cshtml", SitecoreContext.GetCurrentItem<MyType2>());
}

А в самом представлении используйте интерфейс как модель:

@inherits Glass.Mapper.Sc.Web.Mvc.GlassView<ITitleAndBody>

<div>@Editable(Model, x => x.Title)</div>
<p>@Editable(Model, x => x.Body)</p>

Это непроверенный код. Конечно, было бы лучше использовать View Renderings.

person jammykam    schedule 27.08.2015

Согласитесь с тем, что предложил jammykam в его комментарии выше - самым простым было бы переименовать поля шаблона, чтобы они были одинаковыми.

Итак, согласно вашему примеру, все они будут физически называться Title; для редакторов контента вы можете использовать отображаемое имя справки для определенного поля, поэтому они по-прежнему будут отображаться как Заголовок вместо Заголовок, несмотря на то, что на самом деле они оба называются Заголовок для системы . Конечно, если ваше решение позволяет такое переименование... Подробнее об этом подходе по ссылке: http://goo.gl/b28s2y (последняя часть).

Другой вариант для рассмотрения - вы можете подумать о прокси-объектах поверх ваших стеклянных моделей, которые будут переназначать ваши имена полей на все, что вы хотите. Таким образом, ваши прокси-объекты с одинаковыми именами передаются в представление.

Но, вы правы, в самом сложном случае, вероятно, ответом были бы интерфейсы.

person Martin Miles    schedule 27.08.2015
comment
Прокси-модель звучит как то, что я ищу, но когда я попытался «отобразить» ее, она ломает редактор контента, как будто он теряет информацию, необходимую для обновления полей. - person Rob Allen; 28.08.2015

В качестве альтернативы, если поля одинаковы, вы можете изменить их заголовки в свойствах полей шаблона. Таким образом, когда я создаю элемент шаблона X, мне будет представлен заголовок поля, назначенный шаблону X, в то время как само поле FieldName останется прежним.

Но если мне придется это сделать, я бы предпочел использовать интерфейсы со стеклом.

person xoail    schedule 27.08.2015
comment
Я имел в виду то, что прокомментировал jammykam. - person xoail; 28.08.2015