DD4T и динамическое связывание - PullRequest
3 голосов
/ 15 марта 2012

Динамическое разрешение ссылок на компоненты в представлениях с использованием DD4T - не в полях расширенного текста с использованием ResolveRichText() - но если у компонента A есть поле ссылки на компонент со ссылкой на компонент B и в вашем представлении вы хотите отобразить URL-адрес страницы компонент B опубликован на ...

В решении нет помощника - верно?

Немного заржавел с ASP.NET MVC 3, поэтому пуристы отводят взгляд, но ниже работает, мне просто нужно создать Html Helper.

@using DD4T.Providers.SDLTridion2011sp1;

@{
    var linkFactory = new LinkFactory();
    linkFactory.LinkProvider = new TridionLinkProvider();
    var link = linkFactory.ResolveLink(Model.Component.Fields["related_link"].LinkedComponentValues[0].Id);
}

Хотя это было немного странно, в проекте уже нет помощника для этого.

Приветствия

Ответы [ 3 ]

9 голосов
/ 16 марта 2012

Я думаю, что вы правы, это должно быть в рамках.Но, к счастью, это очень легко добавить.Просто создайте вспомогательный класс с методом расширения, подобным следующему:

namespace MyApp.Helpers
{
    public static class ModelHelper
    {
        public static string GetResolvedUrl(this IComponent component)
        {
            return GetResolvedUrl(component, null, null);
        }
    }
}

Теперь, если вы убедитесь, что ваше представление использует пространство имен MyApp.Helpers, вы можете сделать это в представлениях компонентов:

@model DD4T.ContentModel.Component
@using MyApp.Helpers
<a href="@Model.GetResolvedUrl()">click here</a>

Мы, вероятно, скоро включим это в структуру.

6 голосов
/ 16 марта 2012

HTML-помощник для разрешения ссылки действительно не существует.Основная причина, вероятно, заключается в том, что (в соответствии с принципами MVC) ссылка должна быть уже разрешена в модели, которую отображает ваше представление.

Если вы извлекаете класс ContentModel из проекта dd4t.ContentModel, есть (прокомментированоout) свойство ResolvedUrl для компонента.Это никогда не реализовано, но это более подходящее место для разрешения ссылки.Но ваш код выполняет свою работу, поэтому не стесняйтесь реализовать свой собственный помощник HTML.

2 голосов
/ 16 марта 2012

Приятной частью добавления собственного метода расширения является то, что у вас есть возможность сделать что-то еще там.

Например, мы используем его, чтобы различать component.Multimedia.Url и LinkFactory.ResolveLink (component.Id), в зависимости от того, является ли компонент мультимедийным или обычным (так как мультимедийные компоненты, такие как файл PDF, обычно не размещаются на странице, поэтому динамическое разрешение ссылок не даст вам результата.

...