asp.net – 具有MVC的Sitecore’动态占位符’
我正在寻找一个在MVC中工作的动态占位符解决方案。
对于WebForms使用这个“模式”至少有两个很好的描述: > http://trueclarity.wordpress.com/2012/06/19/dynamic-placeholder-keys-in-sitecore/ 而且我也发现这个博客解释了如何使用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)); } } 它以名称创建了一个占位符。 获取动态占位符的占位符设置的代码 /// <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 = @"(.+)_[dw]{8}-([dw]{4}-){3}[dw]{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); } } } 以下代码会从裁剪器中的chrome数据中删除guid /// <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 = @"(.+)_[dw]{8}-([dw]{4}-){3}[dw]{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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 带有lambda表达式的ASP.net MVC Action URL
- 61条面向对象设计的经验原则 转载
- asp.net-mvc – Stack Overflow问题路由
- asp.net-mvc – WS-FED身份验证(ADFS)和ASP.NET Identity U
- asp.net – 为什么在Visual Studio 2010中禁用“使用自定义
- 非常非常简单的asp.net页面需要永远加载
- asp.net – 无法从代码隐藏中调用App_Code类
- 禁用ASP.net文本框而不实际禁用它?
- ASP.NET 使用Swagger开发Web API接口项目
- asp.net-mvc – 为什么在ASP.NET MVC 3中,默认路由不适用于
- ASP.NET MVC3 Razor – 如何有条件地退出或结束或
- asp.net-mvc-4 – MVC 4 – 从视图中的Controlle
- asp.net-web-api – 在身份验证过滤器中的Challe
- 如何找出我的线程在ASP.NET中停止的原因?
- asp.net-mvc – 如何限制访问我的服务器上的pdf文
- asp.net-mvc – 显式指定ASP.NET MVC中控制器返回
- asp-classic – 使用ADO Stream逐行读取大文件?
- asp.net – 如何使用Process Monitor确定哪个DLL
- asp.net-mvc – 使用MVC 5中的Entity Framework
- asp.net – 从WebMethod访问函数背后的代码