URL Filtering in custom module
Hi All,
I have built a custom module and it i sitting nicely on a page. One requirement is to filter the list view and i was thinking of doing this via a simple widget that simply post backs and changes the url to include the filter slash.
for example:
base url: localhost:1111/locations
After a city is picked:
localhost:1111/.../london
This will filter the results to show all locations that are in London (city is a custom property) and if they then select a location it simply goes to the direct page.
Now that the example is outlines, how do i go about doing this??, i tried updating the load data method in my master list view (and i knew it woudnt be this simple :)) but, as expected i get 404 errors.
var query = this.Manager.GetLocations();if (masterDefinition.AllowUrlQueries.HasValue && masterDefinition.AllowUrlQueries.Value) query = this.EvaluateUrl(query, "City", "City", this.Host.UrlEvaluationMode, this.Host.UrlKeyPrefix);Yes, no, maybe?
Hi Roberto Modica,
This is possible, however you have to build a custom URL evaluator for this. I am not aware of this City property so I have build a custom evaluator which works with string. I am basing my sample on the products catalog module. You can find sample code bellow:
using System;using System.Text.RegularExpressions;using System.Web;using Telerik.Sitefinity.Pages.Model;using Telerik.Sitefinity.Web.UrlEvaluation;namespace ProductCatalogSample class CityEvaluator : IUrlEvaluator<string> #region IUrlEvaluator<int> Members public string BuildUrl(string data, UrlEvaluationMode urlEvaluationMode, string urlKeyPrefix) switch (urlEvaluationMode) case UrlEvaluationMode.QueryString: return QueryStringBuilder.Current.Add(String.Concat(urlKeyPrefix, queryStringIdentifier), data.ToString(), true).ToString(); default: string result = string.Empty; if (!string.IsNullOrEmpty(urlKeyPrefix)) result += "/!" + urlKeyPrefix; if (data != string.Empty) result += string.Concat("/"+queryStringIdentifier+"/", data); result += string.Concat("/", QueryStringBuilder.Current.ToString()); return result; public string BuildUrl(string data, string urlKeyPrefix) return this.BuildUrl(data, default(UrlEvaluationMode), urlKeyPrefix); #endregion #region IUrlEvaluator Members public string BuildUrl(object data, Telerik.Sitefinity.Pages.Model.UrlEvaluationMode urlEvaluationMode, string urlKeyPrefix) return this.BuildUrl((string)data, urlEvaluationMode, urlKeyPrefix); public string BuildUrl(object data, string urlKeyPrefix) return this.BuildUrl((string)data, urlKeyPrefix); public string Evaluate(string url, string propertyName, Type contentType, Telerik.Sitefinity.Pages.Model.UrlEvaluationMode urlEvaluationMode, string key, out object[] values) if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url"); string urlKey = string.Concat(key, queryStringIdentifier); switch (urlEvaluationMode) case UrlEvaluationMode.QueryString: string pageString = HttpContext.Current.Request.QueryString[urlKey]; if (!string.IsNullOrEmpty(pageString)) values = new object[] pageString ; else values = new object[] ; return string.Empty; case UrlEvaluationMode.UrlPath: default: MatchCollection matches = Regex.Matches(url, this.regularExpression); if (matches.Count > 1) throw new ArgumentException("More then one matches. URL string should contain only one match."); string sVal = string.Empty; if (matches.Count == 1) if ((string.IsNullOrEmpty(key) && !matches[0].Groups[urlPrefix].Success) || (matches[0].Groups[urlPrefix].Success && matches[0].Groups[urlPrefix].Value == key)) sVal = matches[0].Groups[queryStringIdentifier].Value; values = new object[] sVal ; return string.Empty; public string Evaluate(string url, string propertyName, Type contentType, string key, out object[] values) return this.Evaluate(url, propertyName, contentType, default(UrlEvaluationMode), key, out values); public string Evaluate(string url, string propertyName, string key, out object[] values) return this.Evaluate(url, propertyName, null, key, out values); public void Initialize(System.Collections.Specialized.NameValueCollection config) if (config == null) throw new ArgumentNullException("config"); this.regularExpression = config["regularExpression"]; if (String.IsNullOrEmpty(this.regularExpression)) this.regularExpression = @"(/?!(?<" + urlPrefix + @">\w+)/)?(?<" + queryStringIdentifier + @">[\w|\-|_|\.]+)(?:/|\z)"; #endregion #region Private Fields private const string urlPrefix = "urlPrefix"; private const string queryStringIdentifier = "city"; private string regularExpression; #endregion public override void Install(SiteInitializer initializer) base.Install(initializer); ... this.InstallCustomUrlEvaluators(initializer); private void InstallCustomUrlEvaluators(SiteInitializer initializer) var dataConfig = initializer.Context.GetConfig<DataConfig>(); var citiesUrlEvaluatorConfig = new DataProviderSettings(dataConfig.UrlEvaluators) Name = "City", Description = "Description", ProviderType = typeof(CityEvaluator) ; if (!dataConfig.UrlEvaluators.ContainsKey("City")) dataConfig.UrlEvaluators.Add(citiesUrlEvaluatorConfig); Hi Radoslav,
This doesn't seem to work for me. When I implement the custom evaluator (I'm using as an example the Locations module from the SDK), the evaluator extracts the city (Austin, in my case) but doesn't seem to filter the results. For example, in a querystring filter like this. I get "Austin" in sVal, but it doesn't seem to filter:
http://localhost:50688/Locations?city=Austin
values = new object[] sVal ;// check for filters on the locations queryif (masterDefinition.AllowUrlQueries.HasValue && masterDefinition.AllowUrlQueries.Value) query = this.EvaluateUrl(query, "Date", "PublicationDate", this.Host.UrlEvaluationMode, this.Host.UrlKeyPrefix); query = this.EvaluateUrl(query, "Author", "Owner", this.Host.UrlEvaluationMode, this.Host.UrlKeyPrefix); query = this.EvaluateUrl(query, "Taxonomy", "", typeof(LocationItem), this.Host.UrlEvaluationMode, this.Host.UrlKeyPrefix); query = this.EvaluateUrl(query, "City", "City", Telerik.Sitefinity.Pages.Model.UrlEvaluationMode.QueryString, this.Host.UrlKeyPrefix);