From 65ae99abd48784dc9f3f8d2ad0feb9015fdae785 Mon Sep 17 00:00:00 2001 From: myates Date: Fri, 25 Sep 2015 10:46:29 +1000 Subject: [PATCH] Ensure the modified taxonomy items are not lost if a model validation error occurs. --- .../Drivers/TaxonomyFieldDriver.cs | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs index 96e76cf6f..7ad197a7c 100644 --- a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/TaxonomyFieldDriver.cs @@ -58,28 +58,7 @@ namespace Orchard.Taxonomies.Drivers { } protected override DriverResult Editor(ContentPart part, TaxonomyField field, dynamic shapeHelper) { - return ContentShape("Fields_TaxonomyField_Edit", GetDifferentiator(field, part), () => { - var settings = field.PartFieldDefinition.Settings.GetModel(); - var appliedTerms = GetAppliedTerms(part, field, VersionOptions.Latest).ToDictionary(t => t.Id, t => t); - var taxonomy = _taxonomyService.GetTaxonomyByName(settings.Taxonomy); - var terms = taxonomy != null - ? _taxonomyService.GetTerms(taxonomy.Id).Where(t => !string.IsNullOrWhiteSpace(t.Name)).Select(t => t.CreateTermEntry()).ToList() - : new List(0); - - terms.ForEach(t => t.IsChecked = appliedTerms.ContainsKey(t.Id)); - - var viewModel = new TaxonomyFieldViewModel { - DisplayName = field.DisplayName, - Name = field.Name, - Terms = terms, - Settings = settings, - SingleTermId = terms.Where(t => t.IsChecked).Select(t => t.Id).FirstOrDefault(), - TaxonomyId = taxonomy != null ? taxonomy.Id : 0 - }; - - var templateName = settings.Autocomplete ? "Fields/TaxonomyField.Autocomplete" : "Fields/TaxonomyField"; - return shapeHelper.EditorTemplate(TemplateName: templateName, Model: viewModel, Prefix: GetPrefix(field, part)); - }); + return BuildEditorShape(part, field, shapeHelper); } protected override DriverResult Editor(ContentPart part, TaxonomyField field, IUpdateModel updater, dynamic shapeHelper) { @@ -103,7 +82,38 @@ namespace Orchard.Taxonomies.Drivers { _taxonomyService.UpdateTerms(part.ContentItem, checkedTerms, field.Name); } - return Editor(part, field, shapeHelper); + return BuildEditorShape(part, field, shapeHelper, viewModel); + } + + private ContentShapeResult BuildEditorShape(ContentPart part, TaxonomyField field, dynamic shapeHelper, TaxonomyFieldViewModel appliedViewModel = null) { + return ContentShape("Fields_TaxonomyField_Edit", GetDifferentiator(field, part), () => { + var settings = field.PartFieldDefinition.Settings.GetModel(); + var taxonomy = _taxonomyService.GetTaxonomyByName(settings.Taxonomy); + var terms = taxonomy != null + ? _taxonomyService.GetTerms(taxonomy.Id).Where(t => !string.IsNullOrWhiteSpace(t.Name)).Select(t => t.CreateTermEntry()).ToList() + : new List(0); + + // Ensure the modified taxonomy items are not lost if a model validation error occurs + if (appliedViewModel != null) { + terms.ForEach(t => t.IsChecked = appliedViewModel.Terms.Any(at => at.Id == t.Id && at.IsChecked) || t.Id == appliedViewModel.SingleTermId); + } + else { + var appliedTerms = GetAppliedTerms(part, field, VersionOptions.Latest).ToDictionary(t => t.Id, t => t); + terms.ForEach(t => t.IsChecked = appliedTerms.ContainsKey(t.Id)); + } + + var viewModel = new TaxonomyFieldViewModel { + DisplayName = field.DisplayName, + Name = field.Name, + Terms = terms, + Settings = settings, + SingleTermId = terms.Where(t => t.IsChecked).Select(t => t.Id).FirstOrDefault(), + TaxonomyId = taxonomy != null ? taxonomy.Id : 0 + }; + + var templateName = settings.Autocomplete ? "Fields/TaxonomyField.Autocomplete" : "Fields/TaxonomyField"; + return shapeHelper.EditorTemplate(TemplateName: templateName, Model: viewModel, Prefix: GetPrefix(field, part)); + }); } protected override void Exporting(ContentPart part, TaxonomyField field, ExportContentContext context) {