Wiki
Clone wikiBoot.Multitenancy / Domain administration.
#Administration of domain I needed a way to fast and easy create and edit new domains and their databases. I created a solution that is using the DatabaseSection class. See below.
#!c# public class AdminController : Controller { public ActionResult Index() { var domains = DatabaseCollectionReader.conf.DatabaseSections.ToList(); var dm = new DataModel(); if(domains.Any()) dm.Domains.AddRange(domains.Select(d=> d.Name)); return View(dm); } /// <summary> /// Edit selected DatabaseSection /// </summary> /// <param name="id">The id of the DatabaseSetion</param> /// <returns></returns> public ActionResult Edit(string id) { var domain = DatabaseCollectionReader.conf.DatabaseSections.Where(d => d.Name == id).First(); if(domain==null) ModelState.AddModelError("Configuration is not selected.", "Enter a valid configuration."); return View(domain); //Fallback to default configuration. } [HttpPost] public ActionResult Edit(DatabaseSection section) { var domain = DatabaseCollectionReader.conf.DatabaseSections.Where(d=> d.Name==section.Name).First(); domain.Theme = section.Theme; domain.Domains = section.Domains; domain.Connectionstring = section.Connectionstring; domain.DbType = section.DbType; domain.Properties = section.Properties; domain.AutoPersist = true; // For now domain.CurrentConfiguration.Save(); return RedirectToAction("edit", new { id= section.Name } ); } /// <summary> /// Create View. /// </summary> /// <returns></returns> public ActionResult Create() { return View(new DatabaseSection()); } [HttpPost] public ActionResult Create(DatabaseSection section) { if (ModelState.IsValid) { if (string.IsNullOrEmpty(section.Connectionstring) && section.DbType == DbType.SqlCe) section.Connectionstring = string.Format(@"Data Source=|DataDirectory|\{0}.sdf;Persist Security Info=False;", section.Name.ToLower().Replace(" ","")); DatabaseCollectionReader.conf.Databases.Add(section); section.CurrentConfiguration.Save(); //Need to Reboot Boot.Multitenancy.Host.Restart(); } return RedirectToAction("edit", new { id = section.Name }); } /// <summary> /// Removes a DatabaseSection from Collection. /// </summary> /// <param name="section">The section to remove.</param> /// <returns>Redirects to Index View</returns> public ActionResult Delete(string id) { //Just removes it from configuration, doesn't delete database. var section = DatabaseCollectionReader.conf.DatabaseSections.Where(d => d.Name == id).First(); DatabaseCollectionReader.conf.Databases.Remove(section); section.CurrentConfiguration.Save(); return RedirectToAction("Index"); } } public class DataModel { public List<string> Domains { get; set; } = new List<string>(); }
##And the view The cshtml is mostly the same in create/edit view. Just copy paste.
#!#html @model Boot.Multitenancy.Configuration.DatabaseSection <!--In Create View: @using (Html.BeginForm("create", "admin"))--> @using (Html.BeginForm("edit", "admin")) { <div class="container"> <div class="row"> <div class="col-md-4" style="padding-top: 30px;"> <b>Menu</b><br /> <a href="/admin/create">Create new Tenant</a><br /> <a href="/admin">List Tenants</a> </div> <div class="col-md-8" style="padding-top: 30px;padding-bottom: 50px;"> <div class="container"> <div class="row"> <div class="col-md-4">@Html.LabelFor(m => m.Name)</div> <div class="col-md-4"> @Html.DisplayFor(m => m.Name) @Html.HiddenFor(m=> m.Name) <!--In Create View, change to Html.EditorFor(m=> m.Name)--> </div> </div> <div class="row"> <div class="col-md-4">@Html.LabelFor(m => m.AutoPersist)</div> <div class="col-md-4">@Html.EditorFor(m => m.AutoPersist)</div> </div> <div class="row"> <div class="col-md-4">@Html.LabelFor(m => m.Theme)</div> <div class="col-md-4">@Html.EditorFor(m => m.Theme)</div> </div> <div class="row"> <div class="col-md-4">@Html.LabelFor(m => m.Connectionstring)</div> <div class="col-md-4">@Html.EditorFor(m => m.Connectionstring)</div> </div> <div class="row"> <div class="col-md-4">@Html.LabelFor(m => m.DbType)</div> <div class="col-md-4">@Html.EditorFor(m => m.DbType)</div> <!--Replace above in create view: @Html.DropDownList("DBType", new SelectList(new[] { "SqlCe", "SqlServer2008", "MySql5" }, 1))--> </div> <div class="row"> <div class="col-md-4">@Html.LabelFor(m => m.Domains)</div> <div class="col-md-4">@Html.EditorFor(m => m.Domains)</div> </div> <div class="row"> <div class="col-md-4">@Html.LabelFor(m => m.Properties)</div> <div class="col-md-4">@Html.EditorFor(m => m.Properties)</div> </div> <div class="row"> <div class="col-md-8"> </div> <div class="col-md-4"><input type="submit" value="Save" /></div> </div> </div> </div> </div> </div> }
Updated