C# 4.0 是否可以使用自定义类型属性的内容创建orchard自动路由?
我有一个Orchard cms模块,设置了一些额外的内容类型,并通过代码添加了自动路由组件。 一切都很完美,但是我对默认的permalink模式不满意 我试图做的是添加一个自定义模式,并在我的内容类型中使用一个公共属性。在我的例子中,自定义类型有一个名为ClubName的公共属性,我希望使用它(从路由的角度来看,它更有意义)。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部件类名称为
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);
.NoSystem.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"))