我正在寻找一个在MVC中工作的动态占位符解决方案。
对于WebForms使用这个“模式”至少有两个很好的描述:
对于WebForms使用这个“模式”至少有两个很好的描述:
> http://trueclarity.wordpress.com/2012/06/19/dynamic-placeholder-keys-in-sitecore/
> http://www.techphoria414.com/Blog/2011/August/Dynamic_Placeholder_Keys_Prototype
而且我也发现这个博客解释了如何使用MVC:
> http://blogs.perficient.com/portals/2012/10/17/sitecore-mvc-dynamic-placeholders/
首先,我尝试使用MVC blogpost(SitecoreHelper的扩展)中的技术来实现Techphoria的方法(使用GUID),我也尝试实现最后描述的方法(使用增加Column_1,Column_2等的数字后缀)。
随着我尝试的所有变化,我没有成功创建一个工作的解决方案。我的占位符没有得到正确的命名(我最终以奇怪的占位符结构,或占位符重复)。
没有进入我的尝试的细节,我想知道其他人是否有一个可以使用的工作解决方案。
如果我找不到一个已经在工作的解决方案,我会更详细的描述我的问题,看看能不能让它工作。
解决方法
我创建了这个扩展,创建动态的placholder
public static class SitecoreHelper { public static HtmlString DynamicPlaceholder(this Sitecore.Mvc.Helpers.SitecoreHelper helper,string dynamicKey) { var currentRenderingId = RenderingContext.Current.Rendering.UniqueId; return helper.Placeholder(string.Format("{0}_{1}",dynamicKey,currentRenderingId)); } }
它以名称创建了一个占位符。
我还创建了一个提取guid的流程,并检查占位符设置。
获取动态占位符的占位符设置的代码
如果您使用@ Html.Sitecore()创建动态占位符。DynamicPlaceholder(“test”) – 以下代码从名为test的占位符设置中获取设置
/// <summary> /// Handles changing context to the references dynamic "master" renderings settings for inserting the allowed controls for the placeholder and making it editable /// </summary> public class GetDynamicKeyAllowedRenderings : GetAllowedRenderings { //text that ends in a GUID private const string DYNAMIC_KEY_REGEX = @"(.+)_[\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12}"; public new void Process(GetPlaceholderRenderingsArgs args) { Assert.IsNotNull(args,"args"); string placeholderKey = args.PlaceholderKey; Regex regex = new Regex(DYNAMIC_KEY_REGEX); Match match = regex.Match(placeholderKey); if (match.Success && match.Groups.Count > 0) { placeholderKey = match.Groups[1].Value; } else { return; } // Same as Sitecore.Pipelines.GetPlaceholderRenderings.GetAllowedRenderings but with fake placeholderKey Item placeholderItem = null; if (ID.IsNullOrEmpty(args.DeviceId)) { placeholderItem = Client.Page.GetPlaceholderItem(placeholderKey,args.ContentDatabase,args.LayoutDefinition); } else { using (new DeviceSwitcher(args.DeviceId,args.ContentDatabase)) { placeholderItem = Client.Page.GetPlaceholderItem(placeholderKey,args.LayoutDefinition); } } List<Item> collection = null; if (placeholderItem != null) { bool flag; args.HasPlaceholderSettings = true; collection = this.GetRenderings(placeholderItem,out flag); if (flag) { args.CustomData["allowedControlsSpecified"] = true; args.Options.ShowTree = false; } } if (collection != null) { if (args.PlaceholderRenderings == null) { args.PlaceholderRenderings = new List<Item>(); } args.PlaceholderRenderings.AddRange(collection); } } }
/// <summary> /// Replaces the Displayname of the Placeholder rendering with the dynamic "parent" /// </summary> public class GetDynamicPlaceholderChromeData : GetChromeDataProcessor { //text that ends in a GUID private const string DYNAMIC_KEY_REGEX = @"(.+)_[\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12}"; public override void Process(GetChromeDataArgs args) { Assert.ArgumentNotNull(args,"args"); Assert.IsNotNull(args.ChromeData,"Chrome Data"); if ("placeholder".Equals(args.ChromeType,StringComparison.OrdinalIgnoreCase)) { string argument = args.CustomData["placeHolderKey"] as string; string placeholderKey = argument; Regex regex = new Regex(DYNAMIC_KEY_REGEX); Match match = regex.Match(placeholderKey); if (match.Success && match.Groups.Count > 0) { // Is a Dynamic Placeholder placeholderKey = match.Groups[1].Value; } else { return; } // Handles replacing the displayname of the placeholder area to the master reference Item item = null; if (args.Item != null) { string layout = ChromeContext.GetLayout(args.Item); item = Sitecore.Client.Page.GetPlaceholderItem(placeholderKey,args.Item.Database,layout); if (item != null) { args.ChromeData.DisplayName = item.DisplayName; } if ((item != null) && !string.IsNullOrEmpty(item.Appearance.ShortDescription)) { args.ChromeData.ExpandedDisplayName = item.Appearance.ShortDescription; } } } } }
编辑
web.config包含的设置包括如下:
<sitecore> <pipelines> <getPlaceholderRenderings> <processor type="YourNamespace.Pipelines.GetPlaceholderRenderings.GetDynamicKeyAllowedRenderings,YourAssembly" patch:before="processor[@type='Sitecore.Pipelines.GetPlaceholderRenderings.GetAllowedRenderings,Sitecore.Kernel']"/> </getPlaceholderRenderings> <getChromeData> <processor type="YourNamespace.Pipelines.GetChromeData.GetDynamicPlaceholderChromeData,YourAssembly" patch:after="processor[@type='Sitecore.Pipelines.GetChromeData.GetPlaceholderChromeData,Sitecore.Kernel']"/> </getChromeData> </pipelines> </sitecore>