4

EPiServer CMS 7 では、コンテンツ エリアに 1 つ以上のタグを付けることができます。

@Html.PropertyFor(x => x.CurrentPage.MainContent, new { Tag = "ContentTag" })

TemplateDescriptorページ タイプとタグを関連付けて、属性を持つコントローラーを作成する 1 つの方法:

[TemplateDescriptor(
    TemplateTypeCategory = TemplateTypeCategories.MvcPartialController,
    Default = true,
    Tags = new[] { "ContentTag", "SecondTag" }
    )]
public class SitePageDataController : PageController<SitePageData>
{
    public ActionResult Index(SitePageData currentContent)
    {
        return View(currentContent);
    }
}

上記の例では、2 つのタグが原因で SitePageDataController が選択された可能性があります。現在のコントローラが選択されたタグを実行時に確認する方法はありますか?

それらは、タグを取得するコントローラーアクションで呼び出すことができる API ですか?

4

2 に答える 2

1

私が見る限り、タグ値は要求とともに部分コントローラーに送信されないため、すぐにタグを見つける方法はありません。

回避策は、パイプを介して呼び出される TemplateResolved イベントにフックし、タグ名をルート値に追加することです。そうすれば、「tag」という名前のアクションにパラメーターを追加するだけで、現在のタグが取り込まれます。

[InitializableModule]
[ModuleDependency(typeof(InitializationModule))]
public class SiteInitializer : IInitializableModule {

    public void Initialize(InitializationEngine context) {   
        var templateResolver = ServiceLocator.Current.GetInstance<TemplateResolver>();
        templateResolver.TemplateResolved += OnTemplateResolved;
    }

    private void OnTemplateResolved(object sender, TemplateResolverEventArgs templateArgs) {
        var routeData = templateArgs.WebContext.Request.RequestContext.RouteData;

        if (!string.IsNullOrEmpty(templateArgs.Tag) && templateArgs.SelectedTemplate != null) {
            // add the tag value to route data. this will be sent along in the child action request. 
            routeData.Values["tag"] = templateArgs.Tag;
        }
        else {
            // reset the value so that it doesn't conflict with other requests.
            routeData.Values["tag"] = null;
        }
    }

    public void Uninitialize(InitializationEngine context) { }
    public void Preload(string[] parameters) { }
}

他の目的で使用する場合は、「タグ」以外の名前を選択することをお勧めします。

コントローラー アクションで、タグ パラメーターを追加するだけです。

public ActionResult Index(PageData currentPage, string tag) {
    if (!string.IsNullOrEmpty(tag)) {
        return PartialView(tag, currentPage);
    }

    return PartialView(currentPage);
}
于 2013-11-10T10:57:10.497 に答える