2017-02-07 1 views
1

Используя EpiServer 8.0, нам нужно получить «дружественный» URL-адрес от объекта PageData в классе C#. Без преобразования URL-адреса внутренние ссылки выглядят как «localhost/link/[guid] .aspx» вместо «localhost/friendly-link». Я видел онлайн сообщения, которые предполагают следующее:Как извлечь дружественный URL-адрес из объекта PageData EpiServer?

var urlHelper = ServiceLocator.Current.GetInstance<UrlHelper>(); 
var friendlyUrl = urlHelper.ContentUrl(currentPage.Link); 

Но когда я пытаюсь это, Visual Studio возвращает следующее сообщение об ошибке:

'System.Web.Mvc.UrlHelper' does not contain a definition for 'ContentUrl' and no extension method 'ContentUrl' accepting a first argument of type 'System.Web.Mvc.UrlHelper' could be found (are you missing a using directive or an assembly reference?)

Вот код, который я в настоящее время есть, не используя операторы так легко увидеть пространства имен, которые используются.

var urlHelper = EPiServer.ServiceLocation.ServiceLocator.Current.GetInstance<System.Web.Mvc.UrlHelper>(); 
var friendlyUrl = urlHelper.ContentUrl(myPage.Link); 

Не хватает ли ссылки в нашем проекте, чтобы сделать работу ContentUrl? Или есть какой-то альтернативный код, который мы можем использовать, чтобы получить дружественный URL-адрес из объекта PageData? Спасибо за вашу помощь.

ответ

2

Вы должны использовать UrlResolver класс

using System.Web.Routing; 
using EPiServer.Web.Routing; 

public static class PageDataExtensions 
{ 

    public static VirtualPathData FriendlyUrl(this ContentReference contentReference) 
    { 
     return ServiceLocator.Current.GetInstance<UrlResolver>().GetVirtualPath(contentReference); 
     // or use the singleton 
     // return UrlResolver.Current.GetVirtualPath(contentReference); 
    } 

    public static VirtualPathData FriendlyUrl(this PageData pageData) 
    { 
     var contentReference = pageData.ContentLink; 
     return ServiceLocator.Current.GetInstance<UrlResolver>().GetVirtualPath(contentReference); 
     // or use the singleton 
     // return UrlResolver.Current.GetVirtualPath(contentReference); 
    } 

    public static VirtualPathData FriendlyUrl(this IContent iContent) 
    { 
     var contentReference = iContent.ContentLink; 
     return ServiceLocator.Current.GetInstance<UrlResolver>().GetVirtualPath(contentReference); 
     // or use the singleton 
     // return UrlResolver.Current.GetVirtualPath(contentReference); 
    } 
} 

Это возвращает VirtualPathData объект, которые имеют свойство VirtualPath

В вашем случае

var friendlyUrl = currentPage.FriendlyUrl().VirtualPath; // using the extensions above 

вернется friendly-url/whatever/page

+0

Спасибо за это Эрик. –

+0

@KenPalmer Добро пожаловать, обновите образец немного –

1

System.Web.Mvc.UrlHelper не имеет метода ContentUrl. Вероятно, вы думаете о классе UrlExtensions.

UrlExtensions использует EPiServer.Web.Routing.UrlResolver внутренне. Вы можете использовать локатор сервисов (или инъекцию конструктора, желательно), чтобы получить экземпляр UrlResolver. Затем вы можете сделать urlResolver.GetUrl(myPage.ContentLink);

Смежные вопросы