public ActionResult Settings(bool?save_preset, string save_preset_existing, string save_preset_custom, string preset, ThemeType themeType) { if (!save_preset.HasValue) { save_preset = false; } if (string.IsNullOrEmpty(preset)) { preset = "Default"; } var theme = new ThemeHandler(MASTERdomain, themeType == ThemeType.MOBILE); // handle files if (Request.Files.Count != 0) { foreach (var filename in Request.Files.AllKeys) { var file = Request.Files[filename]; if (file == null || file.ContentLength == 0) { continue; } theme.SaveImage(filename, file.InputStream); } } // duplicate collection as original is read-only var values = new Dictionary <string, object>(); foreach (string entry in Request.Form.Keys) { if (entry == "save_preset" || entry == "save_preset_existing" || entry == "save_preset_custom" || entry == "preset") { continue; } var val = Request.Form.GetValues(entry).FirstOrDefault(); bool boolval; if (bool.TryParse(val, out boolval)) { values[entry] = boolval; } else { values[entry] = val; } } var selectedPreset = ""; if (save_preset.Value) { if (save_preset_existing == "new" && !string.IsNullOrEmpty(save_preset_custom)) { // if new preset name is specified then use the defined name selectedPreset = save_preset_custom; } else { // otherwise we just use current preset selectedPreset = preset; } } else { selectedPreset = preset; } // convert to json string // read current settings from file var old_settings = JsonConvert.DeserializeObject <ThemeSettings>(theme.GetSettingsText()); // just set preset old_settings.presets[selectedPreset] = values; old_settings.current = selectedPreset; // serialise and save to file var settings_string = JsonConvert.SerializeObject(old_settings, Formatting.Indented); theme.SaveSettings(settings_string); // save preset to db MASTERdomain.theme.preset = selectedPreset; // update versions switch (themeType) { case ThemeType.MAIN: MASTERdomain.theme.theme_version = DateTime.UtcNow.Ticks.ToString("x"); break; case ThemeType.MOBILE: MASTERdomain.theme.theme_mobile_version = DateTime.UtcNow.Ticks.ToString("x"); break; default: throw new ArgumentOutOfRangeException("themeType"); } repository.Save(); // need to invalidate any cached liquid assets CacheHelper.Instance.invalidate_dependency(DependencyType.liquid_assets, MASTERdomain.uniqueid); return(RedirectToAction("Index")); }