【问题标题】:Is it possible to create an orchard autoroute using contents of a custom type property?是否可以使用自定义类型属性的内容创建果园自动路由?
【发布时间】:2012-07-30 06:15:19
【问题描述】:

我有一个 Orchard cms 模块,其中设置了一些额外的内容类型,并通过代码添加了一个 AutoRoute 组件。 一切正常,但我对默认的永久链接模式不满意。

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

我尝试了{Content.TrackPart.ClubName}{Content.Track.ClubName}{ContentItem.TrackPart.ClubName}{Content.TrackPart.ClubName} 和其他各种变体,但似乎没有任何效果。

我对果园很陌生,所以我很可能会遗漏一些简单的东西。
任何帮助将不胜感激。

为了响应@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>

以上代码基于 Orchard.Fields 模块中的 DateTimeField 标记。

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

【问题讨论】:

    标签: c#-4.0 orchardcms routes permalinks


    【解决方案1】:

    我遇到了同样的问题。

    经过一些故障排除后,我设法通过将实现更改为以下内容来使自动路由正常工作(适应您的示例,请注意您的设置可能需要对 linq 函数进行一些更改):

    在你的令牌类中:

    • 首先添加 using System.Linq 语句。
    • 然后将您的 Evaluate 实现更改为以下内容:

      context.For<IContent>("Content")
             .Token("ClubName", (Func<IContent>, object>)(content => 
                  content.ContentItem.Parts.OfType<TrackPart>().First().ClubName));
      
    • 确保 Migrations.cs 中的 AutoroutePart 设置使用内容前缀。喜欢:

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

    【讨论】:

    • Evaluate 实现中的Token() 调用可以缩短为.Token("ClubName", content =&gt; content.As&lt;TrackPart&gt;().ClubName);。不需要System.Linq
    • 由于提供字典对象的方法,“_data-dictionary”仅包含“Content”键:private IDictionary&lt;string, object&gt; BuildTokenContext(IContent item) { return new Dictionary&lt;string, object&gt; { { "Content", item } }; }(它返回一个字典,其中只有 1 项,键为“Content ") 在 Orchard.Web\Modules\Orchard.Autoroute\Services\AutorouteService.cs 第 77 行。因此,为了让您的令牌工作,必须从令牌下拉列表中的“内容项”类别中选择它们。这解释了为什么您必须在该类别下创建令牌。
    【解决方案2】:

    您必须制作自己的令牌。这真的很容易。复制一个工作示例。

    【讨论】:

    • 感谢您的信息。这个框架太棒了!我听取了您的建议并制作了自己的令牌,它毫无问题地出现在路线菜单中。但是,仍然没有使用正确的信息生成路线。我认为这与 Evaluate() 函数的最后一行有关。我不确定我是否真的在获取数据来生成路线。
    • 是的,这可能取决于自动路由何时开始工作。我不确定如何确保事情发生的顺序。我去问问。
    • 谢谢。那太好了。
    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 2014-04-16
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多