/// <summary> /// Build the ng string for the div data element /// </summary> /// <param name="ng"></param> /// <returns></returns> private static string BuildNg2Div(Nanogallery ng) { var start = $"{{ "; var end = $"}}"; var body = $""; foreach (var prop in ng.GetType().GetProperties()) { var val = prop.GetValue(ng, null); if (prop.GetCustomAttributes(typeof(RenderAttribute), false).Length > 0 && val != null) { if (IsSpecialProperty(prop)) { body += RenderSpecial(val, prop.Name); } else if (val.GetType() == typeof(bool)) { // bools are uppercase first late strings, so for JS convert to lower case string body += $"\"{GetDescription(prop)}\": \"{val.ToString().ToLower()}\","; } else if (val.GetType() == typeof(int)) { body += $"\"{GetDescription(prop)}\": {val},"; } else { if (Int32.TryParse((string)val, out var num)) { body += $"\"{GetDescription(prop)}\": {val},"; } else { body += $"\"{GetDescription(prop)}\": \"{val}\","; } } } } var str = (start + body.Substring(0, body.Length - 1) + end); return(str); }
/// <summary> /// Render a nanogallery from a list of images /// </summary> /// <param name="htmlHelper"></param> /// <param name="list"></param> /// <param name="ng"></param> /// <param name="albumId"></param> /// <returns></returns> public static IHtmlString Nanogallery(this HtmlHelper htmlHelper, IEnumerable list, Nanogallery ng = null, string albumId = null) { var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); var div = new TagBuilder("div"); div.Attributes.Add("data-nanogallery2", BuildNg2Div(ng ?? new Nanogallery())); div.Attributes.Add("id", "nanogallery" + $"-{albumId}"); var refs = BuildListGallery(urlHelper, list); foreach (var aref in refs) { div.InnerHtml += aref.ToString(TagRenderMode.Normal); } var writer = new HelperResult(x => { // it's encoded here, so need to decode... x.Write(div.ToString().Replace("'", "\'")); }); return(writer); }