/// <summary> /// This will return null if the item text begins with -- /// </summary> /// <param name="dataItem"></param> /// <returns></returns> private MenuExItem CreateItem(object dataItem) { MenuExItem item = new MenuExItem(); item.Text = DataBinder.Eval(dataItem, this.DataTextField, "{0}"); if (this.DataFilterFields != null && this.DataFilterFields.Length > 0) { if (_evaluator == null) { _evaluator = new XPathEvaluator(); } Dictionary <string, object> dict = this.DataFilterFields.Select((p, i) => new { Field = string.Format("Filter{0}", i), Value = DataBinder.Eval(dataItem, p) }).ToDictionary(p => p.Field, p => p.Value); _evaluator.Callback = p => dict[p]; if (!_evaluator.Matches(this.FilterExpression)) { return(null); } } item.NavigateUrl = DataBinder.Eval(dataItem, this.DataNavigateUrlField, "{0}"); item.ToolTip = DataBinder.Eval(dataItem, this.DataToolTipField, "{0}"); if (!string.IsNullOrEmpty(this.DataRolesField)) { IEnumerable roles = (IEnumerable)DataBinder.Eval(dataItem, this.DataRolesField); string[] rolesArray = roles.Cast <string>().ToArray(); if (rolesArray.Length > 0) { item.RolesRequired = rolesArray; } } return(item); }
/// <summary> /// Add <see cref="Items"/> from the data source. Derived classes should override this to add items /// from their custom data source. /// </summary> protected virtual void PerformDataBinding() { IEnumerable data = PerformSelect(); if (data == null) { // Do nothing. This happens when no data source has been assigned to us return; } _items.Clear(); if (data != null) { //DropDownItemEventArgs args = new DropDownItemEventArgs(); foreach (object dataItem in data) { MenuExItem item = CreateItem(dataItem); // Sharad 5 Aug 2010: In security trimming scenarios, we get items with empty text. We should just ignore these. if (item != null && !string.IsNullOrEmpty(item.Text)) { if (this.DisplayChildItems) { IEnumerable children = (IEnumerable)DataBinder.Eval(dataItem, this.DataChildItemsField); foreach (object childItem in children) { MenuExItem item2 = CreateItem(childItem); if (item2 != null) { item.ChildItems.Add(item2); } } } _items.Add(item); } } } }
/// <summary> /// Renders A tag and possibly a lock icon /// </summary> /// <param name="writer"></param> /// <param name="item"></param> /// <param name="itemWidth"></param> private void RenderItem(HtmlTextWriter writer, MenuExItem item, Unit itemWidth) { if (!string.IsNullOrEmpty(item.ToolTip)) { writer.AddAttribute(HtmlTextWriterAttribute.Title, item.ToolTip); } string iconName = string.Empty; string[] y = new string[] { "ui-button", "ui-widget", "ui-corner-all" }; List <string> cssClasses = new List <string>(y); if (IsSamePageUrl(item)) { cssClasses.Add("ui-state-active"); } else { cssClasses.Add("ui-state-default"); if (item.NavigateUrl.EndsWith("#")) { writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "default"); iconName = "ui-icon-triangle-1-s"; } else { string url = this.ResolveUrl(item.NavigateUrl); writer.AddAttribute(HtmlTextWriterAttribute.Href, url); int index = item.NavigateUrl.IndexOf('?'); bool isAccessible; // Do not pass query string as part of URL if (index < 0) { isAccessible = UrlAuthorizationModule.CheckUrlAccessForPrincipal(item.NavigateUrl, this.Page.User, "GET"); } else { isAccessible = UrlAuthorizationModule.CheckUrlAccessForPrincipal(item.NavigateUrl.Substring(0, index), this.Page.User, "GET"); } if (!isAccessible) { iconName = "ui-icon-locked"; cssClasses.Add("ui-priority-secondary"); } } } if (string.IsNullOrEmpty(iconName)) { cssClasses.Add("ui-button-text-only"); } else { cssClasses.Add("ui-button-text-icon-primary"); } writer.AddAttribute(HtmlTextWriterAttribute.Class, string.Join(" ", cssClasses.ToArray())); if (itemWidth != Unit.Empty) { writer.AddStyleAttribute(HtmlTextWriterStyle.Width, itemWidth.ToString()); } writer.RenderBeginTag(HtmlTextWriterTag.A); if (!string.IsNullOrEmpty(iconName)) { // Show lock icon writer.AddAttribute(HtmlTextWriterAttribute.Class, "ui-button-icon-primary ui-icon " + iconName); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.RenderEndTag(); } writer.AddAttribute(HtmlTextWriterAttribute.Class, "ui-button-text"); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.Write(item.Text); writer.RenderEndTag(); // span writer.RenderEndTag(); // a }
private bool IsSamePageUrl(MenuExItem item) { string url = this.ResolveUrl(item.NavigateUrl); return(url == this.Page.Request.RawUrl); }