public ActionResult Save(SamplesViewModel model)
        {
            bool isSave = !string.IsNullOrEmpty(Request.Form["btnSubmit"]);
            if (!isSave)                
                return Index(model); 

            this.LoadAppConfiguration(model);

            if (this.AppConfig == null)
            {
                // Load the raw Config object without loading anything
                AppConfig = new ApplicationConfiguration();                
            }

            // Read all Formvars directly into the AppConfig
            WebUtils.FormVarsToObject(this.AppConfig, "Configuration.");

            if (model.ConfigTypeSelection == "Default Web.Config")
            {
                // This is simple
                if (this.AppConfig.Write())
                    model.ShowMessage("Keys have been written to Web.Config in the AppConfiguration Section.<hr>" +
                        "For best observation open your web.config and view as values get changed. Note " +
                        "that the Connection String and	MailServerPassword fields are encrypted. Based " +
                        "on the constructor which calls SetEncryption with the field names.");
                else
                    model.ShowError("Writing the keys to config failed... Make sure your permissions are set. " +
                                   AppConfig.ErrorMessage);
            }

            // Writing to WebStoreConfig section in Web.Config
            else if (model.ConfigTypeSelection == "Different Web.Config Section")
            {
                if (this.AppConfig.Write())
                    model.ShowMessage("Keys have been written to Web.Config in the WebStoreConfig Section.<hr>" +
                        "For best observation open your web.config and view as values get changed. Note " +
                        "that the Connection String and	MailServerPassword fields are encrypted. Based " +
                        "on the constructor which calls SetEncryption with the field names.");
                else
                    model.ShowError("Writing the keys to config failed... Make sure your permissions are set. " +
                                   AppConfig.ErrorMessage);
            }

            // Separate Configuration File with .config structure
            else if (model.ConfigTypeSelection == "Different .Config File")
            {
                if (this.AppConfig.Write())
                    model.ShowMessage("Keys have been written to a separate WebStore.Config in a WebStoreConfig Section.<hr>" +
                        "For best observation open WebStore.Config and view as values get changed. Note that changes in " +
                        "an external file will not automatically cause ASP.NET to recycle the Web application. However if you use " +
                        "a static property for the config object (unlike this example) the changes will be visible to all instances anyway");
                else
                    model.ShowError("Writing the keys to WebStore.Config failed... Make sure your permissions are set. " +
                                   AppConfig.ErrorMessage);
            }

            else if (model.ConfigTypeSelection == "Simple Xml File")
            {
                if (this.AppConfig.Write())
                    model.ShowMessage("Keys have been written to a separate XML file WebStoreConfig.Xml.<hr>" +
                        "For best observation open this file and view as values get changed. Note that changes in " +
                        "an external file will not automatically cause ASP.NET to recycle the Web application. However if you use " +
                        "a static property for the config object (unlike this example) the changes will be visible to all instances anyway");
                else
                    model.ShowError("Writing the keys to WebStoreConfig.Xml failed. For this mode to work the Web account need to have write access in the virtual folder." +
                                   AppConfig.ErrorMessage);
            }

            else if (model.ConfigTypeSelection ==  "String")
            {
                string XmlContent = this.AppConfig.WriteAsString();                

                if (!string.IsNullOrEmpty(XmlContent))
                {       
                        model.ShowMessage("Keys have been written to a string .<hr>" +
                        "The output looks like this:<p><pre>" +
                        Server.HtmlEncode(XmlContent) +
                        "</pre>" +
                        "This string is now written into View state and then retrieved from the Config object when reloading this page." +
                        "To see the persisted value, make a change to the settings, save, then move to a different mode, then come back - the change should be persisted. " +
                        "Note that with string and file output you can persist complex objects as long as objects are serializable.");
                        
                }
                else
                    model.ShowError("Writing the keys to string failed... Make sure your permissions are set. " + 
                                   AppConfig.ErrorMessage);
                
                
                HttpContext.Application["XmlString"] = XmlContent;
            }

            else if (model.ConfigTypeSelection == "Database")
            {
                if (this.AppConfig.Write())
                    model.ShowMessage("Keys have been written to the database .<hr>");
                else
                    model.ShowError("Writing the keys to the database failed <hr>" +
                                   "The connecton string or table namea and PK are incorrect. Use the database settings in AppConfiguration " +
                                   "to set up a connection string, then create a table called Config and add a text field called ConfigData and a PK field.");
            }
           


            model.Configuration = this.AppConfig;
            return View("Index",model);
        }
        private void LoadAppConfiguration(SamplesViewModel model)
        {            
           
            // Default Web.Config read with Constructor
            // at first access
            if (model.ConfigTypeSelection == "Default Web.Config")
            {
                // Simply assign the default config object - it gets loaded via 
                // the default constructor defined in AppConfig.cs
                this.AppConfig = App.Configuration;
                
                // force to re-read in case we updated previously
                AppConfig.Read();
            }
            

            // Explicit object creation for the remaining objects, 
            // but you can use the same static constructor approach
            // as with the above

            // Separate Web.Config Section
            else if (model.ConfigTypeSelection == "Different Web.Config Section")
            {
                var provider = new ConfigurationFileConfigurationProvider<ApplicationConfiguration>()
                {
                     ConfigurationSection = "WebStoreConfiguration",
                     PropertiesToEncrypt = "ConnectionString,MailServerPassword", 
                     EncryptionKey = STR_SUPERSECRET
                };
                AppConfig = new ApplicationConfiguration();
                AppConfig.Initialize(provider);
                //this.AppConfig.Read();
            }

                // Separate Web.AppConfig Section
            else if (model.ConfigTypeSelection == "Different .Config File")
            {
                
                var provider = new ConfigurationFileConfigurationProvider<ApplicationConfiguration>()
                {
                    ConfigurationFile= Server.MapPath("~/WebStore.config"),
                    ConfigurationSection = "WebStoreConfiguration",
                    PropertiesToEncrypt = "ConnectionString,MailServerPassword",
                    EncryptionKey = STR_SUPERSECRET
                };

                AppConfig = new ApplicationConfiguration();
                AppConfig.Initialize(provider);
                //this.AppConfig.Read();
            }

            else if (model.ConfigTypeSelection == "Simple Xml File")
            {
                var provider = new XmlFileConfigurationProvider<ApplicationConfiguration>()
                {
                    XmlConfigurationFile = Server.MapPath("WebStoreConfig.xml"),
                    PropertiesToEncrypt = "ConnectionString,MailServerPassword",
                    EncryptionKey = STR_SUPERSECRET
                };

                this.AppConfig = new ApplicationConfiguration();
                AppConfig.Initialize(provider);
                //this.AppConfig.Read();
            }
            else if (model.ConfigTypeSelection == "String")
            {

                string XmlString = HttpContext.Application["XmlString"] as string;
                AppConfig = new ApplicationConfiguration();

                if (XmlString != null)
                {
                    // You can always read from an XML Serialization string w/o
                    // any provider setup
                    AppConfig.Read(XmlString);
                }
            }

            // Not implemented since you will need a database
            // this example uses the connection string configured in the Web.Config
            else if (model.ConfigTypeSelection == "Database")
            {
                var provider = new SqlServerConfigurationProvider<ApplicationConfiguration>()
                {
                    ConnectionString = "DevSampleConnectionString",
                    Tablename = "ConfigData",
                    Key = 1,
                    PropertiesToEncrypt = "ConnectionString,MailServerPassword",
                    EncryptionKey = STR_SUPERSECRET
                };

                AppConfig = new ApplicationConfiguration();
                AppConfig.Initialize(provider);

                if (!this.AppConfig.Read())
                    model.ShowError(
                      "Unable to connect to the Database.<hr>" +
                      "This database samle uses the connection string in the configuration settings " +
                      "with a table named 'ConfigData' and a field named 'ConfigData' to hold the " +
                      "configuration settings. If you have a valid connection string you can click " +
                      "on Save Settings to force the table and a single record to be created.<br><br>" +
                      "Note: The table name is parameterized (and you can change it in the default.aspx.cs page), but the field name always defaults to ConfigData.<hr/>" +
                      AppConfig.ErrorMessage);
            }
        }