From a3082526cd148f7bd961b4244fbd6f60e53f9975 Mon Sep 17 00:00:00 2001 From: hammett Date: Sun, 2 Dec 2007 04:14:38 +0000 Subject: [PATCH] - Fixed MR-84 "Nested classes are mapped wrongly to form fields" git-svn-id: https://svn.castleproject.org/svn/castle/trunk@4552 73e77b4c-caa6-f847-a29a-24ab75ae54b6 --- .../Framework/Internal/ActiveRecordModelBuilder.cs | 7 +++- .../Framework/Internal/Model/ActiveRecordModel.cs | 11 ++++++ .../CreateAction.cs | 3 +- .../Helpers/ARFormHelper.cs | 27 +++++++------ .../Templates/edit.vm | 4 +- .../Templates/list.vm | 4 +- .../Templates/new.vm | 4 +- .../Templates/remove.vm | 4 +- .../ARDataBinder.cs | 9 ++++- .../Helpers/FormHelper.cs | 23 +++++++++++ MonoRail/Changes.txt | 3 ++ .../Controllers/CustomerController.cs | 10 +++++ MonoRail/TestSiteARSupport/Model/Customer.cs | 45 ++++++++++++++++++++++ MonoRail/TestSiteARSupport/MyHttpApplication.cs | 2 +- .../TestSiteARSupport-vs2005.csproj | 3 +- 15 files changed, 132 insertions(+), 27 deletions(-) create mode 100644 MonoRail/TestSiteARSupport/Controllers/CustomerController.cs create mode 100644 MonoRail/TestSiteARSupport/Model/Customer.cs diff --git a/ActiveRecord/Castle.ActiveRecord/Framework/Internal/ActiveRecordModelBuilder.cs b/ActiveRecord/Castle.ActiveRecord/Framework/Internal/ActiveRecordModelBuilder.cs index 0a263fd5e..0a1e49ac7 100644 --- a/ActiveRecord/Castle.ActiveRecord/Framework/Internal/ActiveRecordModelBuilder.cs +++ b/ActiveRecord/Castle.ActiveRecord/Framework/Internal/ActiveRecordModelBuilder.cs @@ -257,12 +257,15 @@ namespace Castle.ActiveRecord.Framework.Internal nestedModel.IsNestedType = true; - Type nestedType = propAtt.MapType != null ? propAtt.MapType : prop.PropertyType; + Type nestedType = propAtt.MapType ?? prop.PropertyType; nestedModel.IsNestedCompositeType = model.IsNestedCompositeType; ProcessProperties(nestedType, nestedModel); ProcessFields(nestedType, nestedModel); - model.Components.Add(new NestedModel(prop, propAtt, nestedModel)); + NestedModel nested = new NestedModel(prop, propAtt, nestedModel); + nestedModel.ParentNested = nested; + + model.Components.Add(nested); } else if (attribute is NestedParentReferenceAttribute) { diff --git a/ActiveRecord/Castle.ActiveRecord/Framework/Internal/Model/ActiveRecordModel.cs b/ActiveRecord/Castle.ActiveRecord/Framework/Internal/Model/ActiveRecordModel.cs index f764ee4f1..5429cdb28 100644 --- a/ActiveRecord/Castle.ActiveRecord/Framework/Internal/Model/ActiveRecordModel.cs +++ b/ActiveRecord/Castle.ActiveRecord/Framework/Internal/Model/ActiveRecordModel.cs @@ -59,6 +59,7 @@ namespace Castle.ActiveRecord.Framework.Internal private KeyModel key; private TimestampModel timestamp; private VersionModel version; + private NestedModel parentNested; private readonly IList imports = new ArrayList(); private readonly IList hasManyToAny = new ArrayList(); @@ -168,6 +169,16 @@ namespace Castle.ActiveRecord.Framework.Internal } /// + /// Gets or sets the parent nested. + /// + /// The parent nested. + public NestedModel ParentNested + { + get { return parentNested; } + set { parentNested = value; } + } + + /// /// Gets or sets a value indicating whether this instance is nested type. /// /// diff --git a/MonoRail/Castle.MonoRail.ActiveRecordScaffold/CreateAction.cs b/MonoRail/Castle.MonoRail.ActiveRecordScaffold/CreateAction.cs index 286076d82..2cd08ba6b 100644 --- a/MonoRail/Castle.MonoRail.ActiveRecordScaffold/CreateAction.cs +++ b/MonoRail/Castle.MonoRail.ActiveRecordScaffold/CreateAction.cs @@ -46,8 +46,7 @@ namespace Castle.MonoRail.ActiveRecordScaffold { AssertIsPost(controller); - instance = binder.BindObject(Model.Type, Model.Type.Name, - builder.BuildSourceNode(controller.Form)); + instance = binder.BindObject(Model.Type, Model.Type.Name, builder.BuildSourceNode(controller.Form)); CommonOperationUtils.SaveInstance(instance, controller, errors, ref prop2Validation, true); diff --git a/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Helpers/ARFormHelper.cs b/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Helpers/ARFormHelper.cs index 517fa0de4..71032a683 100644 --- a/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Helpers/ARFormHelper.cs +++ b/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Helpers/ARFormHelper.cs @@ -21,7 +21,6 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers using System.Reflection; using Castle.ActiveRecord; using Castle.ActiveRecord.Framework.Internal; - using Castle.MonoRail.Framework; using Castle.MonoRail.Framework.Helpers; public class ARFormHelper : FormHelper @@ -35,6 +34,7 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 }; private static readonly int[] Years; + private TextHelper textHelper = new TextHelper(); static ARFormHelper() { @@ -47,7 +47,12 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers Years[year - 1950] = year; } } - + + public TextHelper TextHelper + { + get { return textHelper; } + } + public ICollection GetModelHierarchy(ActiveRecordModel model, object instance) { ArrayList list = new ArrayList(); @@ -192,11 +197,11 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers if (fieldInfo.FieldType == typeof(DateTime)) { - stringBuilder.Append(LabelFor(propName + "day", fieldInfo.Name + ":  ")); + stringBuilder.Append(LabelFor(propName + "day", TextHelper.PascalCaseToWord(fieldInfo.Name) + ":  ")); } else { - stringBuilder.Append(LabelFor(propName, fieldInfo.Name + ":  ")); + stringBuilder.Append(LabelFor(propName, TextHelper.PascalCaseToWord(fieldInfo.Name) + ":  ")); } FieldAttribute propAtt = fieldModel.FieldAtt; @@ -224,11 +229,11 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers if (prop.PropertyType == typeof(DateTime)) { - stringBuilder.Append(LabelFor(propName + "day", prop.Name + ":  ")); + stringBuilder.Append(LabelFor(propName + "day", TextHelper.PascalCaseToWord(prop.Name) + ":  ")); } else { - stringBuilder.Append(LabelFor(propName, prop.Name + ":  ")); + stringBuilder.Append(LabelFor(propName, TextHelper.PascalCaseToWord(prop.Name) + ":  ")); } PropertyAttribute propAtt = propertyModel.PropertyAtt; @@ -254,11 +259,11 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers if (prop.PropertyType == typeof(DateTime)) { - stringBuilder.Append(LabelFor(propName + "day", prop.Name + ":  ")); + stringBuilder.Append(LabelFor(propName + "day", TextHelper.PascalCaseToWord(prop.Name) + ":  ")); } else { - stringBuilder.Append(LabelFor(propName, prop.Name + ":  ")); + stringBuilder.Append(LabelFor(propName, TextHelper.PascalCaseToWord(prop.Name) + ":  ")); } RenderAppropriateControl(model, prop.PropertyType, @@ -289,7 +294,7 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers String propName = CreatePropName(model, prefix, keyModel.Property.Name); - stringBuilder.Append(LabelFor(propName, prop.Name + ":  ")); + stringBuilder.Append(LabelFor(propName, TextHelper.PascalCaseToWord(prop.Name) + ":  ")); IDictionary attrs = new HybridDictionary(true); @@ -441,7 +446,7 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers foreach(String name in names) { options.Add(String.Format("{0} {1}\r\n", - RadioField(propName, name), LabelFor(name, name))); + RadioField(propName, name), LabelFor(name, TextHelper.PascalCaseToWord(name)))); } } } @@ -452,7 +457,7 @@ namespace Castle.MonoRail.ActiveRecordScaffold.Helpers if (model.IsNestedType) { - propName = String.Format("{0}.{1}.{2}", prefix, model.Type.Name, name); + propName = String.Format("{0}.{1}.{2}", prefix, model.ParentNested.Property.Name, name); } else { diff --git a/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Templates/edit.vm b/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Templates/edit.vm index 6fa0ea6e9..0d72a18cd 100644 --- a/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Templates/edit.vm +++ b/MonoRail/Castle.MonoRail.ActiveRecordScaffold/Templates/edit.vm @@ -1,4 +1,4 @@ -

Edit ${model.Type.Name}

+

Edit $Form.TextHelper.PascalCaseToWord($model.Type.Name)

#if($flash.errors)