C# 4.0 是否可以使用自定义类型属性的内容创建orchard自动路由?

C# 4.0 是否可以使用自定义类型属性的内容创建orchard自动路由?,c#-4.0,orchardcms,routes,permalinks,C# 4.0,Orchardcms,Routes,Permalinks,我有一个Orchard cms模块,设置了一些额外的内容类型,并通过代码添加了自动路由组件。 一切都很完美,但是我对默认的permalink模式不满意 我试图做的是添加一个自定义模式,并在我的内容类型中使用一个公共属性。在我的例子中,自定义类型有一个名为ClubName的公共属性,我希望使用它(从路由的角度来看,它更有意义)。 Orchard部件类名称为TrackPart 我尝试了{Content.TrackPart.ClubName},{Content.Track.ClubName},{Con

我有一个Orchard cms模块,设置了一些额外的内容类型,并通过代码添加了自动路由组件。 一切都很完美,但是我对默认的permalink模式不满意

我试图做的是添加一个自定义模式,并在我的内容类型中使用一个公共属性。在我的例子中,自定义类型有一个名为ClubName的公共属性,我希望使用它(从路由的角度来看,它更有意义)。
Orchard部件类名称为
TrackPart

我尝试了
{Content.TrackPart.ClubName}
{Content.Track.ClubName}
{ContentItem.TrackPart.ClubName}
{Content.TrackPart.ClubName}
和其他各种变体,但似乎都不起作用

我对Orchard很陌生,所以我很有可能错过了一些简单的东西。
任何帮助都将不胜感激

为了回应@Bertrand le roy的反馈,我复制了一个示例令牌,创建了自己的令牌。我现在可以在下拉菜单中看到令牌并选择它。但是,路由模式仍然不起作用

我只能假设我误解了Evaluate()函数的
上下文。For
用法。看起来我没有得到我需要的数据

这是我到目前为止所拥有的

公共类TrackPartTokens:ITokenProvider{
私有只读IContentManager\u contentManager

    public TrackPartTokens(IContentManager contentManager) {
        _contentManager = contentManager;
    }

    public Localizer T { get; set; }

    public void Describe(dynamic context) {
        context.For("Track", T("Track"), T("Tokens for Track"))
            .Token("ClubName", T("ClubName"), T("The name of the club."))
            ;
    }

    public void Evaluate(dynamic context) {
        context.For<TrackPart>("Track")
            .Token("ClubName", (Func<TrackPart, object>)(field => field.ClubName))
            .Chain("ClubName", "ClubName", (Func<TrackPart, object>)(field =>field.ClubName))
            ;
    }</code>
公共TrackPartTokens(IContentManager contentManager){ _contentManager=contentManager; } 公共定位器T{get;set;} 公共上下文(动态上下文){ 上下文。对于(“Track”,T(“Track”),T(“Track的代币”)) .Token(“俱乐部名称”,T(“俱乐部名称”),T(“俱乐部名称”)) ; } 公共空间(动态上下文){ 上下文。用于(“跟踪”) .Token(“ClubName”,(Func)(field=>field.ClubName)) .Chain(“ClubName”、“ClubName”、“Func”(field=>field.ClubName)) ; }
上述代码基于Orchard.Fields模块中的DateTimeField令牌

context.For(“DateTimeField”) .Token(“日期”(Func)(field=>field.DateTime))
.Chain(“Date”,“Date”,“Func”(field=>field.DateTime));

您必须制作自己的令牌。这非常简单。复制一个工作示例。

我也有同样的问题

在进行了一些故障排除之后,我通过将实现更改为以下内容(根据您的示例进行了调整,请注意,您的设置可能需要对linq函数进行一些更改),从而使自动路由正常工作:

在您的tokens类中:

  • 首先添加一个usingsystem.Linq语句
  • 然后将评估实施更改为以下内容:

    context.For<IContent>("Content")
           .Token("ClubName", (Func<IContent>, object>)(content => 
                content.ContentItem.Parts.OfType<TrackPart>().First().ClubName));
    

Orchard source中的TokenManager类似乎存在一些问题,该类仅允许目标参数等于“内容”,以便调用:_data.TryGetValue(target,out value)工作(TokenManager.cs,第67行)。我尝试了许多不同的设置,但_data-dictionary始终只包含“内容”键。

谢谢您提供的信息。这个框架太棒了!我接受了您的建议,制作了自己的令牌,它毫无问题地出现在路线菜单中。但是路线仍然没有生成正确的信息。我认为这与Evaluate()的最后一行有关函数。我不确定是否实际获取数据以生成路由。是的,这可能取决于自动路由何时开始工作。我不确定如何确保事情发生的顺序。我将四处询问。谢谢。那太好了。Evaluate实现中的
令牌()
调用可以缩短为
.Token(“ClubName”,content=>content.As().ClubName);
.No
System.Linq
是必需的。由于提供字典对象的方法:
私有IDictionary TokenBuildContext(IContent项){返回新字典{{“content”,item};}
Orchard.Web\Modules\Orchard.Autoroute\Services\AutorouteService.cs第77行中(返回一个字典,其中只有一个项的键为“Content”)。因此,为了使令牌工作,必须从令牌下拉列表中的类别“Content Items”中选择它们。这解释了为什么必须在该类别下创建令牌。
.WithPart("AutoroutePart", partBuilder =>
    partBuilder
    .WithSetting("AutorouteSettings.AllowCustomPattern", "true")
    .WithSetting("AutorouteSettings.AutomaticAdjustmentOnEdit", "false")
    .WithSetting("AutorouteSettings.PatternDefinitions",
    @"[{Name:'Track', Pattern:'{Content.ClubName}', 
        Description:'Your description'}]")
    .WithSetting("AutorouteSettings.DefaultPatternIndex", "0"))