2017-02-07 8 views
1

EpiServer 8.0を使用すると、C#クラス内のPageDataオブジェクトから「フレンドリーな」URLを取得する必要があります。 URLを変換しないと、内部リンクは "localhost/friendly-link"ではなく "localhost/link/[guid] .aspx"のように見えます。私が提案するオンラインの記事を見てきました、次のようにステートメントを使用せずに、ここで EpiServer PageDataオブジェクトからフレンドリーなURLを抽出するにはどうすればよいですか?

'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 = ServiceLocator.Current.GetInstance<UrlHelper>(); 
var friendlyUrl = urlHelper.ContentUrl(currentPage.Link); 

をしかし、私はこれをしようとすると、Visual Studioは、次のエラーを返します。使用されている名前空間を確認するのは簡単です。

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

ContentUrlを作成するプロジェクトの参照がありません。または、PageDataオブジェクトからフレンドリーなURLを取得するために使用できる代替コードがありますか?ご協力いただきありがとうございます。

答えて

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); 
    } 
} 

を使用する必要があります行うことができます。これは、あなたのケースでは財産VirtualPath

を持ってVirtualPathDataオブジェクトを返します

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

を返しますfriendly-url/whatever/page

+0

このEricに感謝します。 –

+0

@KenPalmerご参考までにサンプルを少し更新しました –

1

System.Web.Mvc.UrlHelperにはContentUrlメソッドがありません。あなたはおそらくUrlExtensionsクラスについて考えているでしょう。

UrlExtensionsは内部でEPiServer.Web.Routing.UrlResolverを使用します。 UrlResolverのインスタンスを取得するには、サービスロケータ(またはコンストラクタインジェクション)を使用することができます。そして、あなたはurlResolver.GetUrl(myPage.ContentLink);

関連する問題