在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是否可以在我的控制器操作中调用,它会给我标记?
答案 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);
}