/// <summary> /// The AdditionalData of a node is always populated with the query string data, this method performs this /// operation and ensures that special values are not inserted or that duplicate keys are not added. /// </summary> /// <param name="node"></param> /// <param name="queryStrings"></param> protected void AddQueryStringsToAdditionalData(TreeNode node, FormDataCollection queryStrings) { foreach (var q in queryStrings.Where(x => node.AdditionalData.ContainsKey(x.Key) == false)) { node.AdditionalData.Add(q.Key, q.Value); } }
protected HttpResponseMessage Delete(FormDataCollection form) { foreach (string username in form.Where(kvp => kvp.Key.StartsWith("user_")).Select(kvp => kvp.Key.Substring(5))) { UserIDMapper.DeleteUser(username); } return(GetUserId(form.Get("UserId"))); }
/// <summary> /// The AdditionalData of a node is always populated with the query string data, this method performs this /// operation and ensures that special values are not inserted or that duplicate keys are not added. /// </summary> /// <param name="node"></param> /// <param name="queryStrings"></param> protected virtual void AddQueryStringsToAdditionalData(TreeNode node, FormDataCollection queryStrings) { // Add additional data, ensure treeId isn't added as we've already done that foreach (var q in queryStrings .Where(x => x.Key != "treeId" && !node.AdditionalData.ContainsKey(x.Key))) { node.AdditionalData.Add(q.Key, q.Value); } }
/// <summary> /// Converts a dictionary object to a query string representation such as: /// firstname=shannon&lastname=deminick /// </summary> /// <param name="items"></param> /// <param name="keysToIgnore">Any keys found in this collection will be removed from the output</param> /// <returns></returns> public static string ToQueryString(this FormDataCollection items, params string[] keysToIgnore) { if (items == null) return ""; if (items.Any() == false) return ""; var builder = new StringBuilder(); foreach (var i in items.Where(i => keysToIgnore.InvariantContains(i.Key) == false)) { builder.Append(string.Format("{0}={1}&", i.Key, i.Value)); } return builder.ToString().TrimEnd('&'); }
public Message Post(FormDataCollection collection) { Input.SaveFormParams(collection, nameof(InteractiveMessagesController)); var message = collection.Where(c => c.Key == "payload").Select(c => c.Value).SingleOrDefault(); if (message != null) { var slackMessage = JsonConvert.DeserializeObject <InteractiveMessage>(message); return(VoteToBan(slackMessage)); } else { throw new Exception("InteractiveMessages not found."); } }
private IEnumerable <KeyValuePair <string, string> > GetQueryParamsToSign(Uri url) { if (!SignAllQueryParameters && (QueryParametersToSign == null || !QueryParametersToSign.Any())) { return(Enumerable.Empty <KeyValuePair <string, string> >()); } IEnumerable <KeyValuePair <string, string> > query = new FormDataCollection(url); if (SignAllQueryParameters == false) { query = query.Where(x => QueryParametersToSign.Contains(x.Key)); } return(query.OrderBy(x => x.Value, StringComparer.OrdinalIgnoreCase)); }
/// <summary> /// Converts a dictionary object to a query string representation such as: /// firstname=shannon&lastname=deminick /// </summary> /// <param name="items"></param> /// <param name="keysToIgnore">Any keys found in this collection will be removed from the output</param> /// <returns></returns> public static string ToQueryString(this FormDataCollection items, params string[] keysToIgnore) { if (items == null) { return(""); } if (items.Any() == false) { return(""); } var builder = new StringBuilder(); foreach (var i in items.Where(i => keysToIgnore.InvariantContains(i.Key) == false)) { builder.Append(string.Format("{0}={1}&", i.Key, i.Value)); } return(builder.ToString().TrimEnd(Constants.CharArrays.Ampersand)); }
/// <summary> /// Converts a dictionary object to a query string representation such as: /// firstname=shannon&lastname=deminick /// </summary> /// <param name="items"></param> /// <param name="keysToIgnore">Any keys found in this collection will be removed from the output</param> /// <returns></returns> public static string ToQueryString(this FormDataCollection items, params string[] keysToIgnore) { if (items == null) { return(""); } if (items.Count() == 0) { return(""); } var builder = new StringBuilder(); foreach (var i in items.Where(i => !keysToIgnore.InvariantContains(i.Key))) { builder.Append(string.Format("{0}={1}&", i.Key, i.Value)); } return(builder.ToString().TrimEnd('&')); }
protected HttpResponseMessage Delete(FormDataCollection form) { foreach (string username in form.Where(kvp => kvp.Key.StartsWith("user_")).Select(kvp => kvp.Key.Substring(5))) { UserIDMapper.DeleteUser(username); } return GetUserId(form.Get("UserId")); }
public HttpResponseMessage SubmitForm(FormDataCollection formData) { Logger.Current.Verbose("In SubmitForm method. Request received to submit form."); HttpResponseMessage formSubmissionResponse; SubmittedFormViewModel submittedFormViewModel = new SubmittedFormViewModel(); var context = System.Web.HttpContext.Current.Request; submittedFormViewModel.SubmittedFormFields = new List <SubmittedFormFieldViewModel>(); try { Logger.Current.Informational("Submitted form from Context: " + context.Form); if (formData != null) { var getFormData = formData.ToList(); var submittedToForm = formData.Where(c => c.Key == "formid").FirstOrDefault(); var formAccountId = formData.Where(c => c.Key == "accountid").FirstOrDefault(); var requestDomain = formData.Where(c => c.Key == "domainname").FirstOrDefault(); var submittedBy = formData.Where(c => c.Key == "userid").FirstOrDefault(); var stiTrackingId = formData.Where(c => c.Key == "STITrackingID").FirstOrDefault(); var link = formData.Where(c => c.Key == "redirect-override").FirstOrDefault(); getFormData.Remove(submittedToForm); getFormData.Remove(formAccountId); getFormData.Remove(requestDomain); getFormData.Remove(submittedBy); getFormData.Remove(stiTrackingId); getFormData.Remove(link); int parsedFormId = 0; int parsedAccountId = 0; int.TryParse(submittedToForm.Value, out parsedFormId); int.TryParse(formAccountId.Value, out parsedAccountId); if (parsedFormId > 0 && parsedAccountId > 0) { Logger.Current.Verbose("Request received to submit form with ID: " + parsedFormId); try { var frm = getFormData.GroupBy(x => x.Key).Select(x => new { Key = x.Select(g => g.Key).FirstOrDefault(), value = string.Join("|", x.Select(g => g.Value).ToList()) }); foreach (var field in frm) { submittedFormViewModel.SubmittedFormFields.Add(new SubmittedFormFieldViewModel() { Key = field.Key, Value = !string.IsNullOrEmpty(field.value) ? field.value.Trim() : field.value }); } SubmitFormRequest request = new SubmitFormRequest() { SubmittedFormViewModel = submittedFormViewModel, RequestedBy = this.UserId, AccountId = parsedAccountId }; request.SubmittedFormViewModel.SubmittedOn = DateTime.Now.ToUniversalTime(); request.SubmittedFormViewModel.FormId = parsedFormId; request.SubmittedFormViewModel.AccountId = parsedAccountId; request.SubmittedFormViewModel.IPAddress = requestDomain.Value; request.SubmittedFormViewModel.STITrackingID = stiTrackingId.Value; var domain = accountService.GetAccountDomainUrl(new GetAccountDomainUrlRequest() { AccountId = parsedAccountId }).DomainUrl; var userId = 0; int.TryParse(submittedBy.Value, out userId); request.SubmittedFormViewModel.OwnerId = domain == requestDomain.Value ? userId : 0; // If this is a test form submission domain and requestDomain would be same. Hence, the submitting user will be the owner. formService.SubmitForm(request); } catch (Exception ex) { Logger.Current.Error("Error in form submission: ", ex); } finally { SubmitFormResponse getFormResponse = formService.GetFormAcknowdegement(parsedFormId); Logger.Current.Informational("Response: " + getFormResponse.Acknowledgement.Acknowledgement); formSubmissionResponse = Request.BuildResponse(new FormResponse() { Success = true, Acknowledgement = !string.IsNullOrEmpty(link.Value) ? link.Value : getFormResponse.Acknowledgement.Acknowledgement, AcknowledgementType = !string.IsNullOrEmpty(link.Value) ? AcknowledgementType.Url : getFormResponse.Acknowledgement.AcknowledgementType }); } } else { formSubmissionResponse = new HttpRequestMessage().CreateResponse(HttpStatusCode.NotAcceptable); } } else { throw new Exception("Received empty form data"); } } catch (Exception ex) { ex.Data.Add("submitteddata", formData); Logger.Current.Error("Error in form submission: ", ex); formSubmissionResponse = new HttpRequestMessage().CreateResponse(HttpStatusCode.NotAcceptable); } return(formSubmissionResponse); }
public static IEnumerable <SearchResult> PerformMemberSearch(string filter, FormDataCollection queryStrings, out int totalRecordCount, string memberType = "", int pageNumber = 0, int pageSize = 0, string orderBy = "", Direction orderDirection = Direction.Ascending) { var internalSearcher = ExamineManager.Instance.SearchProviderCollection[Constants.Examine.InternalMemberSearcher]; ISearchCriteria criteria = internalSearcher.CreateSearchCriteria().RawQuery(" +__IndexType:member"); var basicFields = new List <string>() { "id", "_searchEmail", "email", "loginName" }; //build a lucene query if (string.IsNullOrWhiteSpace(filter) && !queryStrings.Any(qs => qs.Key.StartsWith("f_") && !string.IsNullOrWhiteSpace(qs.Value))) { // Generic get everything... criteria.RawQuery("a* b* c* d* e* f* g* h* i* j* k* l* m* n* o* p* q* r* s* t* u* v* w* x* y* z*"); } else { // the __nodeName will be boosted 10x without wildcards // then __nodeName will be matched normally with wildcards // the rest will be normal without wildcards if (!string.IsNullOrWhiteSpace(filter)) { var sb = new StringBuilder(); sb.Append("+("); //node name exactly boost x 10 sb.AppendFormat("__nodeName:{0}^10.0 ", filter.ToLower()); //node name normally with wildcards sb.AppendFormat(" __nodeName:{0}* ", filter.ToLower()); foreach (var field in basicFields) { //additional fields normally sb.AppendFormat("{0}:{1} ", field, filter); } sb.Append(")"); criteria.RawQuery(sb.ToString()); } // Now specific field searching. - these should be ANDed and grouped. foreach (var qs in queryStrings.Where(q => q.Key.StartsWith("f_") && !string.IsNullOrWhiteSpace(q.Value))) { // Got a filter. string alias = qs.Key.Substring(2); var values = queryStrings.GetValue <string>(qs.Key).Split(','); if (values.Length > 0) { criteria.GroupedOr(new[] { alias }, values); } } } //must match index type if (!string.IsNullOrWhiteSpace(memberType)) { criteria.NodeTypeAlias(memberType); } //// Order the results //// Examine Sorting seems too unreliable, particularly on nodeName //if (orderDirection == Direction.Ascending) { // criteria.OrderBy(orderBy.ToLower() == "name" ? "nodeName" : "email"); //} else { // criteria.OrderByDescending(orderBy.ToLower() == "name" ? "nodeName" : "email"); //} var result = internalSearcher.Search(criteria); totalRecordCount = result.TotalItemCount; // Order the results var orderedResults = orderDirection == Direction.Ascending ? result.OrderBy(o => orderBy.ToLower() == "name" ? o.Fields["nodeName"] : o.Fields["email"]) : result.OrderByDescending(o => orderBy.ToLower() == "name" ? o.Fields["nodeName"] : o.Fields["email"]); if (pageSize > 0) { int skipCount = (pageNumber > 0 && pageSize > 0) ? Convert.ToInt32((pageNumber - 1) * pageSize) : 0; if (result.TotalItemCount < skipCount) { skipCount = result.TotalItemCount / pageSize; } return(orderedResults.Skip(skipCount).Take(pageSize)); } return(orderedResults); }
public Guid Post([FromBody] FormDataCollection grouppermissionInfo) { Guid groupId = Guid.Empty; if (grouppermissionInfo != null) { #region Lưu Sys_GroupEntity var groupInfos = grouppermissionInfo.Where(p => !p.Key.Contains("allow")).Distinct().ToList(); Guid id = Guid.Empty; bool IsActivate = false; #region Get Group Info Guid.TryParse(groupInfos.Where(p => p.Key == "ID").Select(p => p.Value).FirstOrDefault(), out id); var code = groupInfos.Where(p => p.Key == Sys_GroupModel.FieldNames.Code).Select(p => p.Value).FirstOrDefault(); var description = groupInfos.Where(p => p.Key == Sys_GroupModel.FieldNames.Notes).Select(p => p.Value).FirstOrDefault(); var groupName = groupInfos.Where(p => p.Key == Sys_GroupModel.FieldNames.GroupName).Select(p => p.Value).FirstOrDefault(); bool.TryParse(groupInfos.Where(p => p.Key == Sys_GroupModel.FieldNames.IsActivate).Select(p => p.Value).FirstOrDefault(), out IsActivate); #endregion var group = new Sys_GroupEntity() { ID = id, IsActivate = IsActivate, Code = code, Notes = description, GroupName = groupName }; var groupService = new Sys_GroupServices(); if (group.ID == Guid.Empty) { //add var statusAdding = groupService.Add <Sys_GroupEntity>(group); groupId = group.ID; } else { //edit string statusSysGroup = string.Empty; groupId = id; var statusEditing = groupService.GetSysGroupById(group.ID); if (statusEditing != null) { statusEditing.IsActivate = group.IsActivate; statusEditing.Code = group.Code; statusEditing.Notes = group.Notes; statusEditing.Description = group.Notes; statusEditing.GroupName = group.GroupName; groupService.Edit <Sys_GroupEntity>(statusEditing); } } #endregion List <Guid> listResourceId = new List <Guid>(); List <string> lstValue = grouppermissionInfo.Where(p => p.Key.Contains("allow") && p.Value != "0").Select(m => m.Value).Distinct().ToList(); var lstAdding = new List <Sys_GroupPermission2Entity>(); var lstEditing = new List <Sys_GroupPermission2Entity>(); var service = new Sys_GroupPermissionServices(); //[Tung.Ly 20150114] - Modify : lay danh sach Sys_GroupPermission2 bởi GroupID bằng entity thay vì dùng store // Dùng store không lấy được dữ liệu => nên tạm thời dùng entity var groupPermisstion2s = service.GetAllGroupPermissionByGroupId(groupId); foreach (string itemValue in lstValue) { //lay thong tin nhom quyen var lstgrouppermissionInfo = grouppermissionInfo.Where(m => m.Key.Contains("allow") && m.Value == itemValue).ToList(); int privilegeNumber = 0; Guid resourceId = Guid.Empty; Guid.TryParse(itemValue, out resourceId); if (resourceId != Guid.Empty && !listResourceId.Any(p => p == resourceId)) { listResourceId.Add(resourceId); } #region Get Privilege (View/Create/Modify/Delete/Export/Import) foreach (var item in lstgrouppermissionInfo) { var lst = item.Key.Split(new char[] { '_' }); int number = int.Parse(lst[2]); switch (number) { case 1: privilegeNumber = privilegeNumber + (int)PrivilegeType.View; break; case 2: privilegeNumber = privilegeNumber + (int)PrivilegeType.Create; break; case 3: privilegeNumber = privilegeNumber + (int)PrivilegeType.Modify; break; case 4: privilegeNumber = privilegeNumber + (int)PrivilegeType.Delete; break; case 5: privilegeNumber = privilegeNumber + (int)PrivilegeType.Export; break; case 6: privilegeNumber = privilegeNumber + (int)PrivilegeType.Import; break; } } #endregion #region Thêm/chỉnh sửa nhóm quyền groupId = group.ID; var groupPermisstion = groupPermisstion2s.Where(p => p.ResourceID == resourceId).FirstOrDefault(); if (groupPermisstion == null || groupPermisstion.ID == Guid.Empty) { groupPermisstion = new Sys_GroupPermission2Entity { GroupID = groupId, ResourceID = resourceId, PrivilegeNumber = privilegeNumber }; if (lstAdding.FirstOrDefault(p => p.ResourceID == resourceId && p.GroupID == groupId) == null) { lstAdding.Add(groupPermisstion); } } else { if (groupPermisstion.PrivilegeNumber != privilegeNumber) { groupPermisstion.PrivilegeNumber = privilegeNumber; //check groupPermission exist if (lstEditing.FirstOrDefault(p => p.ResourceID == resourceId && p.GroupID == groupId) == null) { lstEditing.Add(groupPermisstion); } } } #endregion }//close foreach #region Thêm/Chỉnh sửa danh sách nhóm quyền (GroupPermission) var gService = new Sys_GroupPermissionServices(); gService.CreateOrUpdateGroupPermission(groupId, lstAdding, lstEditing, listResourceId); #endregion } return(groupId); }
public static IEnumerable<SearchResult> PerformMemberSearch(string filter, FormDataCollection queryStrings, out int totalRecordCount, string memberType = "", int pageNumber = 0, int pageSize = 0, string orderBy = "", Direction orderDirection = Direction.Ascending) { var internalSearcher = ExamineManager.Instance.SearchProviderCollection[Constants.Examine.InternalMemberSearcher]; ISearchCriteria criteria = internalSearcher.CreateSearchCriteria().RawQuery(" +__IndexType:member"); //build a lucene query if (string.IsNullOrWhiteSpace(filter) && !queryStrings.Any(qs => qs.Key.StartsWith("f_") && !string.IsNullOrWhiteSpace(qs.Value))) { // Generic get everything... criteria.RawQuery("a* b* c* d* e* f* g* h* i* j* k* l* m* n* o* p* q* r* s* t* u* v* w* x* y* z*"); } else { // the __nodeName will be boosted 10x without wildcards // then __nodeName will be matched normally with wildcards // the rest will be normal without wildcards if (!string.IsNullOrWhiteSpace(filter)) { var sb = new StringBuilder(); sb.Append("+("); //node name exactly boost x 10 sb.AppendFormat("__nodeName:{0}^10.0 ", filter.ToLower()); //node name normally with wildcards sb.AppendFormat(" __nodeName:{0}* ", filter.ToLower()); var basicFields = new List<string>() { "id", "_searchEmail", "email", "loginName" }; var userFields = ExamineManager.Instance.IndexProviderCollection["InternalMemberIndexer"].IndexerData.UserFields.Select(x => x.Name); basicFields.AddRange(userFields); foreach (var field in basicFields.Distinct()) { //additional fields normally sb.AppendFormat("{0}:{1} ", field, filter); } sb.Append(")"); criteria.RawQuery(sb.ToString()); } // Now specific field searching. - these should be ANDed and grouped. foreach (var qs in queryStrings.Where(q => q.Key.StartsWith("f_") && !string.IsNullOrWhiteSpace(q.Value))) { // Got a filter. string alias = qs.Key.Substring(2); var values = queryStrings.GetValue<string>(qs.Key).Split(','); if (values.Length > 0) { criteria.GroupedOr(new[] { alias }, values); } } } //must match index type if (!string.IsNullOrWhiteSpace(memberType)) { criteria.NodeTypeAlias(memberType); } //// Order the results //// Examine Sorting seems too unreliable, particularly on nodeName //if (orderDirection == Direction.Ascending) { // criteria.OrderBy(orderBy.ToLower() == "name" ? "nodeName" : "email"); //} else { // criteria.OrderByDescending(orderBy.ToLower() == "name" ? "nodeName" : "email"); //} var result = internalSearcher.Search(criteria); totalRecordCount = result.TotalItemCount; // Order the results var orderedResults = orderDirection == Direction.Ascending ? result.OrderBy(o => orderBy.ToLower() == "name" ? o.Fields["nodeName"] : o.Fields["email"]) : result.OrderByDescending(o => orderBy.ToLower() == "name" ? o.Fields["nodeName"] : o.Fields["email"]); if (pageSize > 0) { int skipCount = (pageNumber > 0 && pageSize > 0) ? Convert.ToInt32((pageNumber - 1) * pageSize) : 0; if (result.TotalItemCount < skipCount) { skipCount = result.TotalItemCount / pageSize; } return orderedResults.Skip(skipCount).Take(pageSize); } return orderedResults; }
/// <summary> /// Converts a legacy XmlTreeNode to a new TreeNode /// </summary> /// <param name="parentId"></param> /// <param name="xmlTreeNode"></param> /// <param name="urlHelper"></param> /// <param name="currentSection"></param> /// <param name="currentQueryStrings"> /// The current query strings for the request - this is used to append the query strings to the menu URL of the item being rendered since the menu /// actually belongs to this same node (request) the query strings need to exist so the menu can be rendered in some cases. /// </param> /// <param name="isRoot"></param> /// <returns></returns> internal static TreeNode ConvertFromLegacy(string parentId, XmlTreeNode xmlTreeNode, UrlHelper urlHelper, string currentSection, FormDataCollection currentQueryStrings, bool isRoot = false) { // /umbraco/tree.aspx?rnd=d0d0ff11a1c347dabfaa0fc75effcc2a&id=1046&treeType=content&contextMenu=false&isDialog=false //we need to convert the node source to our legacy tree controller var childNodesSource = urlHelper.GetUmbracoApiService <LegacyTreeController>("GetNodes"); var childQuery = (xmlTreeNode.Source.IsNullOrWhiteSpace() || xmlTreeNode.Source.IndexOf('?') == -1) ? "" : xmlTreeNode.Source.Substring(xmlTreeNode.Source.IndexOf('?')); //append the query strings childNodesSource = childNodesSource.AppendQueryStringToUrl(childQuery); //for the menu source we need to detect if this is a root node since we'll need to set the parentId and id to -1 // for which we'll handle correctly on the server side. //if there are no menu items, then this will be empty var menuSource = ""; if (xmlTreeNode.Menu != null && xmlTreeNode.Menu.Any()) { menuSource = urlHelper.GetUmbracoApiService <LegacyTreeController>("GetMenu"); //these are the absolute required query strings var menuQueryStrings = new Dictionary <string, object> { { "id", (isRoot ? "-1" : xmlTreeNode.NodeID) }, { "treeType", xmlTreeNode.TreeType }, { "parentId", (isRoot ? "-1" : parentId) }, { "section", currentSection } }; //append the extra ones on this request foreach (var i in currentQueryStrings.Where(x => menuQueryStrings.Keys.Contains(x.Key) == false)) { menuQueryStrings.Add(i.Key, i.Value); } menuSource = menuSource.AppendQueryStringToUrl(menuQueryStrings.ToQueryString()); } //TODO: Might need to add stuff to additional attributes var node = new TreeNode(xmlTreeNode.NodeID, isRoot ? null : parentId, childNodesSource, menuSource) { HasChildren = xmlTreeNode.HasChildren, Icon = xmlTreeNode.Icon, Name = xmlTreeNode.Text, NodeType = xmlTreeNode.NodeType }; if (isRoot) { node.AdditionalData.Add("treeAlias", xmlTreeNode.TreeType); } foreach (var appliedClass in xmlTreeNode.Style.AppliedClasses) { node.CssClasses.Add(appliedClass); } //This is a special case scenario, we know that content/media works based on the normal Belle routing/editing so we'll ensure we don't // pass in the legacy JS handler so we do it the new way, for all other trees (Currently, this is a WIP), we'll render // the legacy js callback,. var knownNonLegacyNodeTypes = new[] { "content", "contentRecycleBin", "mediaRecyleBin", "media" }; if (knownNonLegacyNodeTypes.InvariantContains(xmlTreeNode.NodeType) == false) { node.AssignLegacyJsCallback(xmlTreeNode.Action); } return(node); }
/// <summary> /// Converts a legacy XmlTreeNode to a new TreeNode /// </summary> /// <param name="parentId"></param> /// <param name="xmlTreeNode"></param> /// <param name="urlHelper"></param> /// <param name="currentSection"></param> /// <param name="currentQueryStrings"> /// The current query strings for the request - this is used to append the query strings to the menu URL of the item being rendered since the menu /// actually belongs to this same node (request) the query strings need to exist so the menu can be rendered in some cases. /// </param> /// <param name="isRoot"></param> /// <returns></returns> internal static TreeNode ConvertFromLegacy(string parentId, XmlTreeNode xmlTreeNode, UrlHelper urlHelper, string currentSection, FormDataCollection currentQueryStrings, bool isRoot = false) { // /umbraco/tree.aspx?rnd=d0d0ff11a1c347dabfaa0fc75effcc2a&id=1046&treeType=content&contextMenu=false&isDialog=false //we need to convert the node source to our legacy tree controller var childNodesSource = urlHelper.GetUmbracoApiService<LegacyTreeController>("GetNodes"); var childQuery = (xmlTreeNode.Source.IsNullOrWhiteSpace() || xmlTreeNode.Source.IndexOf('?') == -1) ? "" : xmlTreeNode.Source.Substring(xmlTreeNode.Source.IndexOf('?')); //append the query strings childNodesSource = childNodesSource.AppendQueryStringToUrl(childQuery); //for the menu source we need to detect if this is a root node since we'll need to set the parentId and id to -1 // for which we'll handle correctly on the server side. //if there are no menu items, then this will be empty var menuSource = ""; if (xmlTreeNode.Menu != null && xmlTreeNode.Menu.Any()) { menuSource = urlHelper.GetUmbracoApiService<LegacyTreeController>("GetMenu"); //these are the absolute required query strings var menuQueryStrings = new Dictionary<string, object> { {"id", (isRoot ? "-1" : xmlTreeNode.NodeID)}, {"treeType", xmlTreeNode.TreeType}, {"parentId", (isRoot ? "-1" : parentId)}, {"section", currentSection} }; //append the extra ones on this request foreach (var i in currentQueryStrings.Where(x => menuQueryStrings.Keys.Contains(x.Key) == false)) { menuQueryStrings.Add(i.Key, i.Value); } menuSource = menuSource.AppendQueryStringToUrl(menuQueryStrings.ToQueryString()); } //TODO: Might need to add stuff to additional attributes var node = new TreeNode(xmlTreeNode.NodeID, isRoot ? null : parentId, childNodesSource, menuSource) { HasChildren = xmlTreeNode.HasChildren, Icon = xmlTreeNode.Icon, Name = xmlTreeNode.Text, NodeType = xmlTreeNode.NodeType }; if (isRoot) { node.AdditionalData.Add("treeAlias", xmlTreeNode.TreeType); } //This is a special case scenario, we know that content/media works based on the normal Belle routing/editing so we'll ensure we don't // pass in the legacy JS handler so we do it the new way, for all other trees (Currently, this is a WIP), we'll render // the legacy js callback,. var knownNonLegacyNodeTypes = new[] { "content", "contentRecycleBin", "mediaRecyleBin", "media" }; if (knownNonLegacyNodeTypes.InvariantContains(xmlTreeNode.NodeType) == false) { node.AssignLegacyJsCallback(xmlTreeNode.Action); } return node; }