public ActionResult Index()
        {
            if (DataHelper.TableIsExisted()) return RedirectToAction(RedirectToActionAfterInstall[1], RedirectToActionAfterInstall[0]);

            // set page timeout to 5 minutes
            this.Server.ScriptTimeout = 300;

            var model = new InstallModel()
            {
                AdminEmail = "*****@*****.**",
                SqlServerName = @".\SQLExpress",
                DatabaseConnectionString = "",
                DataProvider = "sqlserver",
                SqlAuthenticationType = "sqlauthentication",
                SqlServerCreateDatabase = false,
                UseCustomCollation = false,
                Collation = "SQL_Latin1_General_CP1_CI_AS",
            };

            return View(model);
        }
        public ActionResult Index(InstallModel model)
        {
            if (DataHelper.TableIsExisted()) return RedirectToAction(RedirectToActionAfterInstall[1], RedirectToActionAfterInstall[0]);

            if (model.DatabaseConnectionString != null)
                model.DatabaseConnectionString = model.DatabaseConnectionString.Trim();
            //try
            //{
                var webHelper = IoC.Resolve<IWebHelper>();
                if (!DataHelper.HasSettingsFileOrNotNull()) // check Settings.txt file is existed.
                {
                    if (model.DataProvider.Equals("sqlserver", StringComparison.InvariantCultureIgnoreCase))
                    {
                        //values
                        if (string.IsNullOrEmpty(model.SqlServerName))
                            ModelState.AddModelError("", "Server name is required!");
                        if (string.IsNullOrEmpty(model.SqlDatabaseName))
                            ModelState.AddModelError("", "Database name is required!");

                        //authentication type
                        if (model.SqlAuthenticationType.Equals("sqlauthentication", StringComparison.InvariantCultureIgnoreCase))
                        {
                            //SQL authentication
                            if (string.IsNullOrEmpty(model.SqlServerUsername))
                                ModelState.AddModelError("", "Sqlserver Username is required!");
                            if (string.IsNullOrEmpty(model.SqlServerPassword))
                                ModelState.AddModelError("", "Sqlserver Password is required!");
                            if(model.SqlServerPassword.Trim().Equals(model.ConfirmPassword))
                                ModelState.AddModelError("", "Sqlserver Password is not duplicated!");
                        }
                    }

                    //validate permissions
                    var dirsToCheck = FilePermissionHelper.GetDirectoriesWrite(webHelper);
                    foreach (string dir in dirsToCheck)
                        if (!FilePermissionHelper.CheckPermissions(dir, false, true, true, false))
                            ModelState.AddModelError("", string.Format("{0} cannot be writable for {1}", WindowsIdentity.GetCurrent().Name, dir));

                    var filesToCheck = FilePermissionHelper.GetFilesWrite(webHelper);
                    foreach (string file in filesToCheck)
                        if (!FilePermissionHelper.CheckPermissions(file, false, true, true, true))
                            ModelState.AddModelError("", string.Format("{0} cannot be writable for {1}", WindowsIdentity.GetCurrent().Name, file));

                    if (ModelState.IsValid)
                    {
                        DataHelper.SaveSettings("SqlServer",
                            model.SqlAuthenticationType == "windowsauthentication",
                            model.SqlServerName,
                            model.SqlDatabaseName,
                            model.SqlServerUsername,
                            model.SqlServerPassword);
                    }
                }
                if (DataHelper.HasSettingsFileOrNotNull())
                {
                    if (model.SqlServerCreateDatabase)
                    {
                        var collation = model.UseCustomCollation ? model.Collation : "";
                        DataHelper.CreateDatabase(collation);
                    }
                    else
                    {
                        if (!DataHelper.DatabaseIsExisted())
                            throw new Exception("Database is not existed!");
                    }

                    // init tables or instace db.
                    var dataProviderInstance = IoC.Resolve<IDataProvider>();
                    dataProviderInstance.InitDatabase();

                    // install all providers
                    InstallationManager.Install();

                    // install default admin
                    var installAccountFirstService = IoC.Resolve<IInstallAccountFirstService>();
                    installAccountFirstService.Install(model.AdminEmail, model.AdminPassword);

                    DataHelper.ResetCache();

                    //install plugins
                    PluginManager.MarkAllPluginsAsUninstalled();
                    var pluginFinder = IoC.Resolve<IPluginFinder>();
                    var plugins = pluginFinder.GetPlugins<IPlugin>(false)
                        .ToList()
                        .OrderBy(x => x.PluginDescriptor.Group)
                        .ThenBy(x => x.PluginDescriptor.DisplayOrder)
                        .ToList();
                    foreach (var plugin in plugins)
                    {
                        plugin.Install();
                    }

                    webHelper.RestartAppDomain(true, "~/install/success");
                }
            //}
            //catch (Exception ex)
            //{
            //    ViewBag.ErrorMessage = ex.Message;
            //    DataHelper.RemoveSettingsFile();
            //    DataHelper.ResetCache();
            //}
            return View(model);
        }