我如何知道哪个标签导致控制器被选中?

时间:2013-11-08 16:04:24

标签: episerver episerver-7

在EPiServer CMS 7中,可以使用一个或多个标签标记内容区域:

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

您可以通过一种方式连接页面类型和标签来创建具有TemplateDescriptor属性的控制器:

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

在上面的示例中,可能由于两个标记而选择了SitePageDataController。有没有办法在运行时找出哪个标签导致当前控制器被选中?

他的API是否可以在我的控制器操作中调用,它会给我标记?

2 个答案:

答案 0 :(得分:2)

我知道这个问题是在两年前提出的,但有办法。简短的回答是写

var tag = ControllerContext.ParentActionViewContext.ViewData["tag"] as string;

(可以为空)

在你的行动中。这篇博文详细介绍了http://world.episerver.com/blogs/Anders-Hattestad/Dates/2014/3/EPiServer-7-and-MVC-Views-using-Tags/

答案 1 :(得分: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) { }
}

如果您将其用于其他目的,则可能需要选择与“tag”不同的名称。

在您的控制器操作中,只需添加标记参数:

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

    return PartialView(currentPage);
}