我有一个Orchard cms模块,其中设置了一些其他内容类型,并通过代码添加了一个AutoRoute组件。 一切都很完美,但我对默认的永久链接模式不满意。
我要做的是添加自定义模式并使用我的内容类型中的一个公共属性。在我的情况下,自定义类型有一个名为ClubName的公共属性,我希望使用它(从路由角度来看更有意义)。
Orchard零件类名称称为TrackPart
。
我尝试了{Content.TrackPart.ClubName}
,{Content.Track.ClubName}
,{ContentItem.TrackPart.ClubName}
,{Content.TrackPart.ClubName}
以及其他各种变体,但似乎没有任何效果。
我对Orchard来说真的很新,所以很有可能我错过了一些简单的事情 任何帮助将不胜感激。
为了回应@ Bertrand-le-roy的反馈,我通过复制示例令牌创建了自己的令牌。我现在可以在下拉菜单中看到令牌并选择它。但是路线模式仍然不起作用。
我只能假设我误解了Evaluate()函数的context.For
用法。看起来我没有得到我需要的数据
这是我到目前为止所拥有的。
public class TrackPartTokens : ITokenProvider {
private readonly IContentManager _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>
The above code was based on the DateTimeField token inside the Orchard.Fields module.
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>
答案 0 :(得分:3)
我遇到了同样的问题。
经过一些故障排除后,我设法通过将我的实现更改为以下内容来实现自动运行(适用于您的示例,请注意您的设置可能需要对linq函数进行一些更改):
在你的代币课程中:
然后将您的Evaluate实施更改为以下内容:
context.For<IContent>("Content")
.Token("ClubName", (Func<IContent>, object>)(content =>
content.ContentItem.Parts.OfType<TrackPart>().First().ClubName));
确保Migrations.cs中的AutoroutePart设置使用Content-prefix。像:
.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"))
Orchard源中的TokenManager-class似乎存在一些问题,它们只允许target-parameter等于“Content”以便调用:_data.TryGetValue(target,out value)才能工作(TokenManager.cs) ,第67行)。我尝试了许多不同的设置,但_data-dictionary总是只包含“Content”键。
答案 1 :(得分:2)
你必须自己制作令牌。这真的很容易。复制一个工作示例。