2009-09-15 Marek Habersack <mhabersack@novell.com>
authorMarek Habersack <grendel@twistedcode.net>
Mon, 14 Sep 2009 23:24:54 +0000 (23:24 -0000)
committerMarek Habersack <grendel@twistedcode.net>
Mon, 14 Sep 2009 23:24:54 +0000 (23:24 -0000)
* Makefile (TEST_RESOURCE_FILES): added
Test/WebPages/ListView_DynamicControl_09.aspx and
Test/WebPages/ListView_DynamicControl_09.aspx.cs

2009-09-15  Marek Habersack  <mhabersack@novell.com>

* FieldTemplateFactoryTest.cs: implemented tests for
BuildVirtualPath, GetFieldTemplateVirtualPath and PreprocessMode.

2009-09-15  Marek Habersack  <mhabersack@novell.com>

* MetaColumn.cs: DataTypeAttribtue created automatically for
string columns, must be of type MultilineText for long strings.

* FieldTemplateFactory.cs: implemented BuildVirtualPath,
CreateFieldTemplate, GetFieldTemplateVirtualPath, PreprocessMode
and fixed implementation of TemplateFolderVirtualPath.

2009-09-15  Marek Habersack  <mhabersack@novell.com>

* DataTypeAttribute.cs: implemented GetDataTypeName

2009-09-15  Marek Habersack  <mhabersack@novell.com>

* ListView.cs: CreateChildControls calls EnsureDataBound only if
we're not in post-back and if data binding is required.

svn path=/trunk/mcs/; revision=141922

26 files changed:
mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ChangeLog
mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/DataTypeAttribute.cs
mcs/class/System.Web.DynamicData/ChangeLog
mcs/class/System.Web.DynamicData/Makefile
mcs/class/System.Web.DynamicData/System.Web.DynamicData/ChangeLog
mcs/class/System.Web.DynamicData/System.Web.DynamicData/FieldTemplateFactory.cs
mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaColumn.cs
mcs/class/System.Web.DynamicData/System.Web.DynamicData_test.dll.sources
mcs/class/System.Web.DynamicData/Test/Common/AssociatedBar.cs
mcs/class/System.Web.DynamicData/Test/Common/AssociatedFoo.cs
mcs/class/System.Web.DynamicData/Test/Common/Baz.cs
mcs/class/System.Web.DynamicData/Test/Common/BazWithDataTypeAttribute.cs [new file with mode: 0644]
mcs/class/System.Web.DynamicData/Test/Common/FieldTemplatePathTables.cs [new file with mode: 0644]
mcs/class/System.Web.DynamicData/Test/Common/FieldTemplateTestDescription.cs [new file with mode: 0644]
mcs/class/System.Web.DynamicData/Test/Common/PokerFieldTemplateUserControl.cs [new file with mode: 0644]
mcs/class/System.Web.DynamicData/Test/Common/TestDataContext3.cs [new file with mode: 0644]
mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerModelProvider.cs
mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/ChangeLog
mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicControlTest.cs
mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/FieldTemplateFactoryTest.cs
mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/FieldTemplateUserControlTest.cs [new file with mode: 0644]
mcs/class/System.Web.DynamicData/Test/WebPages/Global.asax
mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_09.aspx [new file with mode: 0644]
mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_09.aspx.cs [new file with mode: 0644]
mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ChangeLog
mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ListView.cs

index 4cbe157ab3773c2bd1d8dfcf9984dfac6974cd1d..3bc4ea696760b9d94e8b0630518c804978831aff 100644 (file)
@@ -1,3 +1,7 @@
+2009-09-15  Marek Habersack  <mhabersack@novell.com>
+
+       * DataTypeAttribute.cs: implemented GetDataTypeName
+
 2009-06-23  Marek Habersack  <mhabersack@novell.com>
 
        * ValidationAttribute.cs: error message must not ever be empty.
index cd857f102d94ceabceb005da74453cced8bb1eaf..edf06cfe90149e7b0301222fd1153c16d659aa0f 100644 (file)
@@ -65,10 +65,13 @@ namespace System.ComponentModel.DataAnnotations
                public DataType DataType { get; private set; }
                public DisplayFormatAttribute DisplayFormat { get; protected set; }
 
-               [MonoTODO]
                public virtual string GetDataTypeName ()
                {
-                       throw new NotImplementedException ();
+                       DataType dt = DataType;
+                       if (dt == DataType.Custom)
+                               return CustomDataType;
+
+                       return dt.ToString ();
                }
 
                [MonoTODO]
index 1640e7dd2d7bfaa9cd66f219bca6a2a01f86b3c2..0d08502bc18f0171c65ecbcd9ab7ba42021b6ced 100644 (file)
@@ -1,3 +1,9 @@
+2009-09-15  Marek Habersack  <mhabersack@novell.com>
+
+       * Makefile (TEST_RESOURCE_FILES): added
+       Test/WebPages/ListView_DynamicControl_09.aspx and
+       Test/WebPages/ListView_DynamicControl_09.aspx.cs
+
 2009-09-10  Marek Habersack  <mhabersack@novell.com>
 
        * Makefile (TEST_RESOURCE_FILES): added 
index 1b3094b4c18c8c4def949bdbe02038b9efce31a9..39211196d939e4b176df4aec14630a9bce3c8e5f 100644 (file)
@@ -155,6 +155,8 @@ TEST_RESOURCE_FILES = \
        Test/WebPages/ListView_DynamicControl_07.aspx.cs,MonoTests.WebPages.ListView_DynamicControl_07.aspx.cs  \
        Test/WebPages/ListView_DynamicControl_08.aspx,MonoTests.WebPages.ListView_DynamicControl_08.aspx        \
        Test/WebPages/ListView_DynamicControl_08.aspx.cs,MonoTests.WebPages.ListView_DynamicControl_08.aspx.cs  \
+       Test/WebPages/ListView_DynamicControl_09.aspx,MonoTests.WebPages.ListView_DynamicControl_09.aspx        \
+       Test/WebPages/ListView_DynamicControl_09.aspx.cs,MonoTests.WebPages.ListView_DynamicControl_09.aspx.cs  \
        Test/WebPages/Site.css,MonoTests.WebPages.Site.css      \
        Test/WebPages/Site.master,MonoTests.WebPages.Site.master        \
        Test/WebPages/Site.master.cs,MonoTests.WebPages.Site.master.cs  \
index f83a542127e978b1b19821752463e663e4687e3f..c21f40c136743e0e55747db65d32bfd277aea188 100644 (file)
@@ -1,3 +1,12 @@
+2009-09-15  Marek Habersack  <mhabersack@novell.com>
+
+       * MetaColumn.cs: DataTypeAttribtue created automatically for
+       string columns, must be of type MultilineText for long strings.
+
+       * FieldTemplateFactory.cs: implemented BuildVirtualPath,
+       CreateFieldTemplate, GetFieldTemplateVirtualPath, PreprocessMode
+       and fixed implementation of TemplateFolderVirtualPath.
+
 2009-09-10  Marek Habersack  <mhabersack@novell.com>
 
        * DynamicControl.cs: implemented several properties.
index e30c8ecba59cbf042dd3f27869186fb4eeeba310..2d913bd09bfab083670e11b3211afcc9d2f6bc60 100644 (file)
@@ -3,8 +3,9 @@
 //
 // Author:
 //     Atsushi Enomoto <atsushi@ximian.com>
+//      Marek Habersack <mhabersack@novell.com>
 //
-// Copyright (C) 2008 Novell Inc. http://novell.com
+// Copyright (C) 2008-2009 Novell Inc. http://novell.com
 //
 
 //
@@ -31,11 +32,15 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Specialized;
+using System.ComponentModel;
+using System.ComponentModel.DataAnnotations;
 using System.Globalization;
+using System.IO;
 using System.Security.Permissions;
 using System.Security.Principal;
 using System.Web.Caching;
 using System.Web.Compilation;
+using System.Web.Hosting;
 using System.Web.UI.WebControls;
 
 namespace System.Web.DynamicData
@@ -45,8 +50,24 @@ namespace System.Web.DynamicData
        public class FieldTemplateFactory : IFieldTemplateFactory
        {
                const string DEFAULT_TEMPLATE_FOLDER_VIRTUAL_PATH = "FieldTemplates/";
+
+               static readonly Dictionary <Type, Type> typeFallbacks = new Dictionary <Type, Type> () {
+                       {typeof (float), typeof (decimal)},
+                       {typeof (double), typeof (decimal)},
+                       {typeof (short), typeof (int)},
+                       {typeof (long), typeof (int)},
+                       {typeof (byte), typeof (int)},
+                       {typeof (char), typeof (string)},
+                       {typeof (int), typeof (string)},
+                       {typeof (decimal), typeof (string)},
+                       {typeof (Guid), typeof (string)},
+                       {typeof (DateTime), typeof (string)},
+                       {typeof (DateTimeOffset), typeof (string)},
+                       {typeof (TimeSpan), typeof (string)}
+               };
                
                string templateFolderVirtualPath;
+               string userTemplateVirtualPath;
                
                public MetaModel Model { get; private set; }
 
@@ -54,61 +75,206 @@ namespace System.Web.DynamicData
                        get {
                                if (templateFolderVirtualPath == null) {
                                        MetaModel m = Model;
+                                       string virtualPath = userTemplateVirtualPath == null ? DEFAULT_TEMPLATE_FOLDER_VIRTUAL_PATH : userTemplateVirtualPath;
+
+                                       if (m != null)
+                                               templateFolderVirtualPath = VirtualPathUtility.Combine (m.DynamicDataFolderVirtualPath, virtualPath);
+                                       else
+                                               templateFolderVirtualPath = virtualPath;
 
-                                       templateFolderVirtualPath = m != null ?
-                                               m.DynamicDataFolderVirtualPath + DEFAULT_TEMPLATE_FOLDER_VIRTUAL_PATH :
-                                               DEFAULT_TEMPLATE_FOLDER_VIRTUAL_PATH;
+                                       templateFolderVirtualPath = VirtualPathUtility.AppendTrailingSlash (templateFolderVirtualPath);
                                }
 
                                return templateFolderVirtualPath;
                        }
                        
                        set {
-                               MetaModel m = Model;
-
-                               if (m != null) {
-                                       if (value == null)
-                                               templateFolderVirtualPath = m.DynamicDataFolderVirtualPath + DEFAULT_TEMPLATE_FOLDER_VIRTUAL_PATH;
-                                       else if (value.Length == 0)
-                                               // "compatibility"
-                                               throw new ArgumentNullException ("value");
-                                       else
-                                               templateFolderVirtualPath = m.DynamicDataFolderVirtualPath + value;
-                               } else {
-                                       if (value == null)
-                                               templateFolderVirtualPath = DEFAULT_TEMPLATE_FOLDER_VIRTUAL_PATH;
-                                       else
-                                               templateFolderVirtualPath = value;
-                               }
-
-                               templateFolderVirtualPath = VirtualPathUtility.AppendTrailingSlash (templateFolderVirtualPath);
+                               userTemplateVirtualPath = value;
+                               templateFolderVirtualPath = null;
                        }
                }
 
-               [MonoTODO]
                public virtual string BuildVirtualPath (string templateName, MetaColumn column, DataBoundControlMode mode)
                {
-                       throw new NotImplementedException ();
+                       // Tests show the 'column' parameter is not used here
+                       
+                       if (String.IsNullOrEmpty (templateName))
+                               throw new ArgumentNullException ("templateName");
+
+                       string basePath = TemplateFolderVirtualPath;
+                       string suffix;
+
+                       switch (mode) {
+                               default:
+                               case DataBoundControlMode.ReadOnly:
+                                       suffix = String.Empty;
+                                       break;
+
+                               case DataBoundControlMode.Edit:
+                                       suffix = "_Edit";
+                                       break;
+
+                               case DataBoundControlMode.Insert:
+                                       suffix = "_Insert";
+                                       break;
+                       }
+                       
+                       return basePath + templateName + suffix + ".ascx";
                }
 
-               [MonoTODO]
                public virtual IFieldTemplate CreateFieldTemplate (MetaColumn column, DataBoundControlMode mode, string uiHint)
                {
                        // NO checks are made on parameters in .NET, but well "handle" the NREX
                        // throws in the other methods
-                       DataBoundControlMode newMode = PreprocessMode (column, mode);
-                       string path = null;
-                       
-                       return (IFieldTemplate) BuildManager.CreateInstanceFromVirtualPath (path, typeof (IFieldTemplate));
+                       return BuildManager.CreateInstanceFromVirtualPath (GetFieldTemplateVirtualPath (column, mode, uiHint), typeof (IFieldTemplate)) as IFieldTemplate;
                }
 
-               [MonoTODO]
                public virtual string GetFieldTemplateVirtualPath (MetaColumn column, DataBoundControlMode mode, string uiHint)
                {
                        // NO checks are made on parameters in .NET, but well "handle" the NREX
                        // throws in the other methods
                        DataBoundControlMode newMode = PreprocessMode (column, mode);
-                       throw new NotImplementedException ();
+                       string templatePath;
+
+                       // The algorithm is as follows:
+                       //
+                       //  1. If column has a DataTypeAttribute on it, get the data type
+                       //     - if it's Custom data type, uiHint is used unconditionally
+                       //     - if it's not a custom type, ignore uiHint and choose template based
+                       //       on type
+                       //
+                       //  2. If #1 is false and uiHint is not empty, use uiHint if the template
+                       //     exists
+                       //
+                       //  3. If #2 is false, look up type according to the following algorithm:
+                       //
+                       //     1. lookup column type's full name
+                       //     2. if #1 fails, look up short type name
+                       //     3. if #2 fails, map type to special type name (Int -> Integer, String
+                       //        -> Text etc)
+                       //     4. if #3 fails, try to find a fallback type
+                       //     5. if #4 fails, check if it's a foreign key or child column
+                       //     6. if #5 fails, return null
+                       //
+                       //     From: http://msdn.microsoft.com/en-us/library/cc488523.aspx (augmented)
+                       //
+
+                       DataTypeAttribute attr = column.DataTypeAttribute;
+                       bool uiHintPresent = !String.IsNullOrEmpty (uiHint);
+                       if (uiHintPresent && uiHint.EndsWith (".ascx", StringComparison.OrdinalIgnoreCase)) {
+                               uiHint = uiHint.Substring (0, uiHint.Length - 5);
+                               if (uiHint.Length == 0)
+                                       uiHintPresent = false;
+                       }
+                       
+                       templatePath = null;
+                       int step = 1;
+                       Type columnType = column.ColumnType;
+
+                       if (uiHintPresent)
+                               step = 0;
+                       else if (attr == null && templatePath == null) {
+                               if (column is MetaChildrenColumn)
+                                       templatePath = GetExistingTemplateVirtualPath ("Children", column, mode);
+                               else if (column is MetaForeignKeyColumn)
+                                       templatePath = GetExistingTemplateVirtualPath ("ForeignKey", column, mode);
+                       }
+                               
+                       while (step < 6 && templatePath == null) {
+                               switch (step) {
+                                       case 0:
+                                               templatePath = GetExistingTemplateVirtualPath (uiHint, column, mode);
+                                               break;
+
+                                       case 1:
+                                               if (attr != null)
+                                                       templatePath = GetTemplateForDataType (attr.DataType, attr.GetDataTypeName (), uiHint, column, mode);
+                                               break;
+                                                       
+                                       case 2:
+                                               templatePath = GetExistingTemplateVirtualPath (columnType.FullName, column, mode);
+                                               break;
+
+                                       case 3:
+                                               templatePath = GetExistingTemplateVirtualPath (columnType.Name, column, mode);
+                                               break;
+
+                                       case 4:
+                                               templatePath = ColumnTypeToSpecialName (columnType, column, mode);
+                                               break;
+
+                                       case 5:
+                                               columnType = GetFallbackType (columnType, column, mode);
+                                               if (columnType == null)
+                                                       step = 5;
+                                               else
+                                                       step = uiHintPresent ? 0 : 1;
+                                               break;
+                               }
+
+                               step++;
+                       }
+
+                       return templatePath;
+               }
+
+               Type GetFallbackType (Type columnType, MetaColumn column, DataBoundControlMode mode)
+               {
+                       Type ret;
+                       if (typeFallbacks.TryGetValue (columnType, out ret))
+                               return ret;
+                       
+                       return null;
+               }
+               
+               string ColumnTypeToSpecialName (Type columnType, MetaColumn column, DataBoundControlMode mode)
+               {
+                       if (columnType == typeof (int))
+                               return GetExistingTemplateVirtualPath ("Integer", column, mode);
+
+                       if (columnType == typeof (string))
+                               return GetExistingTemplateVirtualPath ("Text", column, mode);
+                       
+                       return null;
+               }
+               
+               string GetExistingTemplateVirtualPath (string baseName, MetaColumn column, DataBoundControlMode mode)
+               {
+                       string templatePath = BuildVirtualPath (baseName, column, mode);
+                       if (String.IsNullOrEmpty (templatePath))
+                               return null;
+
+                       // TODO: cache positive hits (and watch for removal events on those)
+                       string physicalPath = HostingEnvironment.MapPath (templatePath);
+                       if (File.Exists (physicalPath))
+                               return templatePath;
+
+                       return null;
+               }
+               
+               string GetTemplateForDataType (DataType dataType, string customDataType, string uiHint, MetaColumn column, DataBoundControlMode mode)
+               {
+                       switch (dataType) {
+                               case DataType.Custom:
+                                       string ret;
+                                       if (!String.IsNullOrEmpty (uiHint))
+                                               ret = GetExistingTemplateVirtualPath (uiHint, column, mode);
+                                       else
+                                               ret = null;
+
+                                       if (ret == null)
+                                               ret = GetExistingTemplateVirtualPath (customDataType, column, mode);
+                                       return ret;
+
+                               case DataType.DateTime:
+                                       return GetExistingTemplateVirtualPath ("DateTime", column, mode);
+
+                               case DataType.MultilineText:
+                                       return GetExistingTemplateVirtualPath ("MultilineText", column, mode);
+                                       
+                               default:
+                                       return GetExistingTemplateVirtualPath ("Text", column, mode);
+                       }
                }
                
                public virtual void Initialize (MetaModel model)
@@ -116,15 +282,22 @@ namespace System.Web.DynamicData
                        Model = model;
                }
 
-               [MonoTODO]
                public virtual DataBoundControlMode PreprocessMode (MetaColumn column, DataBoundControlMode mode)
                {
                        // In good tradition of .NET's DynamicData, let's not check the
                        // parameters...
                        if (column == null)
                                throw new NullReferenceException ();
+
+                       if (column.IsGenerated)
+                               return DataBoundControlMode.ReadOnly;
+                       
+                       if (column.IsPrimaryKey) {
+                               if (mode == DataBoundControlMode.Edit)
+                                       return DataBoundControlMode.ReadOnly;
+                       }
                        
-                       throw new NotImplementedException ();
+                       return mode;    
                }
        }
 }
index 9939fe8c4020fb962df8bbf23f6abd1c3018cd89..d81866bba05a4fa457b27f441c98d06be2fd6d72 100644 (file)
@@ -406,7 +406,7 @@ namespace System.Web.DynamicData
                        dataTypeReflected = true;
                        MetaModel.GetDataFieldAttribute <DataTypeAttribute> (Attributes, ref dataTypeAttr);
                        if (dataTypeAttr == null && (ColumnType == typeof (string)))
-                               return new DataTypeAttribute (DataType.Text);
+                               return new DataTypeAttribute (IsLongString ? DataType.MultilineText : DataType.Text);
 
                        return dataTypeAttr;
                }
index ae31f25cebd5a34c07af664012d7edce1ea8c8c1..86754f143fcc09d25b3fbf2775c2c51a63d9569e 100644 (file)
@@ -33,6 +33,7 @@
 ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/StandardUrl.cs
 ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/WebTest.cs
 ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/WebTestResourcesSetupAttribute.cs
+
 Assembly/AssemblyInfo.cs
 Common/AFieldTemplate.cs
 Common/AssertExtensions.cs
@@ -43,9 +44,12 @@ Common/Baz.cs
 Common/BazDataTypeDefaultTypes.cs
 Common/BazNoStrings.cs
 Common/BazNoStringsNoPrimary.cs
+Common/BazWithDataTypeAttribute.cs
 Common/EmployeesDataContext.cs
 Common/FakeHttpWorkerRequest.cs
 Common/FieldFormattingOptions.cs
+Common/FieldTemplatePathTables.cs
+Common/FieldTemplateTestDescription.cs
 Common/FooBarNoScaffold.cs
 Common/FooDisplayColumnAttribute.cs
 Common/FooDisplayName.cs
@@ -71,9 +75,11 @@ Common/MyDynamicDataRouteHandler.cs
 Common/MyHttpContextWrapper.cs
 Common/MyHttpRequestWrapper.cs
 Common/PokerDynamicControl.cs
+Common/PokerFieldTemplateUserControl.cs
 Common/TestDataColumn.cs
 Common/TestDataContainer.cs
 Common/TestDataContext2.cs
+Common/TestDataContext3.cs
 Common/TestDataContext.cs
 Common/TestDataTable.cs
 Common/TestsBasePage.cs
@@ -105,7 +111,10 @@ System.Web.DynamicData/DynamicDataExtensionsTest.cs
 System.Web.DynamicData/DynamicDataManagerTest.cs
 System.Web.DynamicData/DynamicDataRouteHandlerTest.cs
 System.Web.DynamicData/DynamicDataRouteTest.cs
+System.Web.DynamicData/FieldTemplateFactoryTest.cs
+System.Web.DynamicData/FieldTemplateUserControlTest.cs
 System.Web.DynamicData/MetaColumnTest.cs
 System.Web.DynamicData/MetaModelTest.cs
 System.Web.DynamicData/MetaTableTest.cs
 System.Web.DynamicData.ModelProviders/TableProviderTest.cs
+
index 90b50e80fe9dd9f0c902d01019e0b1cc016bda6e..42f56375f29cda06e7c3bd5d48ef7a4c7a88a463 100644 (file)
@@ -5,11 +5,12 @@ using System.Text;
 
 namespace MonoTests.Common
 {
-       class AssociatedBar
+       public class AssociatedBar
        {
                public string Column1 { get; set; }
                public int Column2 { get; set; }
                public string Column3 { get; set; }
+               public int Column4 { get; set; }
 
                public AssociatedBar ()
                {
index d031aec9896bf6e0632c06b1764270d9856cbecd..a6db9cfd1846000c3607aaa8c37ac65bad44e7ab 100644 (file)
@@ -8,16 +8,19 @@ using MonoTests.ModelProviders;
 
 namespace MonoTests.Common
 {
-       class AssociatedFoo
+       public class AssociatedFoo
        {
                [DynamicDataAssociation ("AssociatedBarTable.Column1", AssociationDirection.OneToOne)]
                public string ForeignKeyColumn1 { get; set; }
 
+               [DynamicDataAssociation ("AssociatedBarTable.Column4", AssociationDirection.OneToOne)]
+               public int ForeignKeyColumn2 { get; set; }
+
                [DynamicDataAssociation ("AssociatedBarTable.Column3", AssociationDirection.ManyToOne)]
                public string PrimaryKeyColumn1 { get; set; }
 
                [DynamicDataAssociation ("AssociatedBarTable.Column2", AssociationDirection.OneToMany)]
-               public int PrimarykeyColumn2 { get; set; }
+               public int PrimaryKeyColumn2 { get; set; }
 
                public int Column1 { get; set; }
        }
index c816329102fdefff9cbbe822752bd285491ba66e..c7ff777b912331b1264ad1a36b6ff53a00af3946 100644 (file)
@@ -48,6 +48,9 @@ namespace MonoTests.Common
                [DynamicDataSortable (true)]
                public int SortableColumn1 { get; set; }
 
+               [UIHint ("MyCustomUIHintTemplate")]
+               public string CustomUIHintColumn { get; set; }
+
                public Baz ()
                {
                        Column1 = 123;
diff --git a/mcs/class/System.Web.DynamicData/Test/Common/BazWithDataTypeAttribute.cs b/mcs/class/System.Web.DynamicData/Test/Common/BazWithDataTypeAttribute.cs
new file mode 100644 (file)
index 0000000..40beb22
--- /dev/null
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+
+namespace MonoTests.Common
+{
+       public class BazWithDataTypeAttribute
+       {
+               [DataType (DataType.Custom)]
+               public string CustomColumn1 { get; set; }
+
+               [DataType (DataType.Custom)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string CustomColumn2 { get; set; }
+
+               [DataType ("MyCustomType")]
+               public string CustomColumn3 { get; set; }
+
+               [DataType ("MyCustomType")]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string CustomColumn4 { get; set; }
+
+               [DataType (DataType.DateTime)]
+               public string DateTimeColumn1 { get; set; }
+
+               [DataType (DataType.DateTime)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string DateTimeColumn2 { get; set; }
+
+               [DataType (DataType.Date)]
+               public string DateColumn1 { get; set; }
+
+               [DataType (DataType.Date)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string DateColumn2 { get; set; }
+
+               [DataType (DataType.Date)]
+               public long DateColumn3 { get; set; }
+
+               [DataType (DataType.Date)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public long DateColumn4 { get; set; }
+
+               [DataType (DataType.Time)]
+               public string TimeColumn1 { get; set; }
+
+               [DataType (DataType.Time)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string TimeColumn2 { get; set; }
+
+               [DataType (DataType.Duration)]
+               public string DurationColumn1 { get; set; }
+
+               [DataType (DataType.Duration)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string DurationColumn2 { get; set; }
+
+               [DataType (DataType.PhoneNumber)]
+               public string PhoneNumberColumn1 { get; set; }
+
+               [DataType (DataType.PhoneNumber)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string PhoneNumberColumn2 { get; set; }
+
+               [DataType (DataType.Currency)]
+               public string CurrencyColumn1 { get; set; }
+
+               [DataType (DataType.Currency)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string CurrencyColumn2 { get; set; }
+
+               [DataType (DataType.Text)]
+               public long TextColumn1 { get; set; }
+
+               [DataType (DataType.Text)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public long TextColumn2 { get; set; }
+
+               [DataType (DataType.Html)]
+               public string HtmlColumn1 { get; set; }
+
+               [DataType (DataType.Html)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string HtmlColumn2 { get; set; }
+
+               [DataType (DataType.MultilineText)]
+               public string MultilineTextColumn1 { get; set; }
+
+               [DataType (DataType.MultilineText)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string MultilineTextColumn2 { get; set; }
+
+               [DataType (DataType.EmailAddress)]
+               public string EmailAddressColumn1 { get; set; }
+
+               [DataType (DataType.EmailAddress)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string EmailAddressColumn2 { get; set; }
+
+               [DataType (DataType.Password)]
+               public string PasswordColumn1 { get; set; }
+
+               [DataType (DataType.Password)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string PasswordColumn2 { get; set; }
+
+               [DataType (DataType.Url)]
+               public string UrlColumn1 { get; set; }
+
+               [DataType (DataType.Url)]
+               [UIHint ("MyCustomUIHintTemplate_Text")]
+               public string UrlColumn2 { get; set; }
+       }
+}
diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FieldTemplatePathTables.cs b/mcs/class/System.Web.DynamicData/Test/Common/FieldTemplatePathTables.cs
new file mode 100644 (file)
index 0000000..38da87b
--- /dev/null
@@ -0,0 +1,278 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using NUnit.Framework;
+using MonoTests.stand_alone.WebHarness;
+using MonoTests.SystemWeb.Framework;
+using MonoTests.Common;
+using MonoTests.DataSource;
+using MonoTests.DataObjects;
+
+namespace MonoTests.Common
+{
+       sealed class FieldTemplatePathTables
+       {
+               public static readonly List<FieldTemplateTestDescription> FieldTemplateReadOnlyColumns = new List<FieldTemplateTestDescription> ()
+               {
+                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean.ascx"),
+                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("SByte_Column"),
+                       new FieldTemplateTestDescription ("UInt_Column"),
+                       new FieldTemplateTestDescription ("ULong_Column"),
+                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("UShort_Column"),
+                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"),
+                       new FieldTemplateTestDescription ("FooEmpty_Column"),
+                       new FieldTemplateTestDescription ("Object_Column"),
+                       new FieldTemplateTestDescription ("ByteArray_Column"),
+                       new FieldTemplateTestDescription ("IntArray_Column"),
+                       new FieldTemplateTestDescription ("StringArray_Column"),
+                       new FieldTemplateTestDescription ("ObjectArray_Column"),
+                       new FieldTemplateTestDescription ("StringList_Column"),
+                       new FieldTemplateTestDescription ("Dictionary_Column"),
+                       new FieldTemplateTestDescription ("ICollection_Column"),
+                       new FieldTemplateTestDescription ("IEnumerable_Column"),
+                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
+                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
+                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
+                       new FieldTemplateTestDescription ("BoolArray_Column"),
+                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/Text.ascx"),
+               };
+
+               public static readonly List<FieldTemplateTestDescription> FieldTemplateEditColumns = new List<FieldTemplateTestDescription> ()
+               {
+                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Text_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean_Edit.ascx"),
+                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
+                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
+                       new FieldTemplateTestDescription ("SByte_Column"),
+                       new FieldTemplateTestDescription ("UInt_Column"),
+                       new FieldTemplateTestDescription ("ULong_Column"),
+                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
+                       new FieldTemplateTestDescription ("UShort_Column"),
+                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime_Edit.ascx"),
+                       new FieldTemplateTestDescription ("FooEmpty_Column"),
+                       new FieldTemplateTestDescription ("Object_Column"),
+                       new FieldTemplateTestDescription ("ByteArray_Column"),
+                       new FieldTemplateTestDescription ("IntArray_Column"),
+                       new FieldTemplateTestDescription ("StringArray_Column"),
+                       new FieldTemplateTestDescription ("ObjectArray_Column"),
+                       new FieldTemplateTestDescription ("StringList_Column"),
+                       new FieldTemplateTestDescription ("Dictionary_Column"),
+                       new FieldTemplateTestDescription ("ICollection_Column"),
+                       new FieldTemplateTestDescription ("IEnumerable_Column"),
+                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
+                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
+                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
+                       new FieldTemplateTestDescription ("BoolArray_Column"),
+                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/MultilineText_Edit.ascx"),
+               };
+
+               public static readonly List<string> NonDefaultFullTypeNameTemplates = new List<string> () {
+                       "System.Char.ascx",
+                       "System.Char.ascx.cs",
+                       "System.Byte.ascx",
+                       "System.Byte.ascx.cs",
+                       "System.Boolean.ascx",
+                       "System.Boolean.ascx.cs",
+                       "System.Int16.ascx",
+                       "System.Int16.ascx.cs",
+                       "System.Int32.ascx",
+                       "System.Int32.ascx.cs",
+                       "System.Int64.ascx",
+                       "System.Int64.ascx.cs",
+                       "System.String.ascx",
+                       "System.String.ascx.cs",
+                       "System.UInt16.ascx",
+                       "System.UInt16.ascx.cs",
+                       "System.UInt32.ascx",
+                       "System.UInt32.ascx.cs",
+                       "System.UInt64.ascx",
+                       "System.UInt64.ascx.cs",
+                       "System.SByte.ascx",
+                       "System.SByte.ascx.cs",
+                       "System.Object.ascx",
+                       "System.Object.ascx.cs",
+                       "System.Byte[].ascx",
+                       "System.Byte[].ascx.cs",
+                       "System.Collections.Generic.List`1[System.String].ascx",
+                       "System.Collections.Generic.List`1[System.String].ascx.cs",
+                       "MonoTests.Common.FooEmpty.ascx",
+                       "MonoTests.Common.FooEmpty.ascx.cs",
+                       "System.Collections.ICollection.ascx",
+                       "System.Collections.ICollection.ascx.cs",
+               };
+
+               public static readonly List<FieldTemplateTestDescription> FieldTemplateNonDefaultColumns = new List<FieldTemplateTestDescription> ()
+               {
+                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/System.Char.ascx"),
+                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/System.Byte.ascx"),
+                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/System.Int32.ascx"),
+                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/System.Int64.ascx"),
+                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/System.Boolean.ascx"),
+                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
+                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
+                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
+                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
+                       new FieldTemplateTestDescription ("SByte_Column", "~/DynamicData/FieldTemplates/System.SByte.ascx"),
+                       new FieldTemplateTestDescription ("UInt_Column", "~/DynamicData/FieldTemplates/System.UInt32.ascx"),
+                       new FieldTemplateTestDescription ("ULong_Column", "~/DynamicData/FieldTemplates/System.UInt64.ascx"),
+                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/System.Int16.ascx"),
+                       new FieldTemplateTestDescription ("UShort_Column", "~/DynamicData/FieldTemplates/System.UInt16.ascx"),
+                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"),
+                       new FieldTemplateTestDescription ("FooEmpty_Column", "~/DynamicData/FieldTemplates/MonoTests.Common.FooEmpty.ascx"),
+                       new FieldTemplateTestDescription ("Object_Column", "~/DynamicData/FieldTemplates/System.Object.ascx"),
+                       new FieldTemplateTestDescription ("ByteArray_Column", "~/DynamicData/FieldTemplates/System.Byte[].ascx"),
+                       new FieldTemplateTestDescription ("IntArray_Column"),
+                       new FieldTemplateTestDescription ("StringArray_Column"),
+                       new FieldTemplateTestDescription ("ObjectArray_Column"),
+                       new FieldTemplateTestDescription ("StringList_Column"),
+
+                       // Doesn't work for some reason
+                       //new FieldTemplateTestDescription ("StringList_Column", "~/DynamicData/FieldTemplates/System.Collections.Generic.List`1[System.String].ascx"),
+                       new FieldTemplateTestDescription ("Dictionary_Column"),
+                       new FieldTemplateTestDescription ("ICollection_Column", "~/DynamicData/FieldTemplates/System.Collections.ICollection.ascx"),
+                       new FieldTemplateTestDescription ("IEnumerable_Column"),
+                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
+                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
+                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
+                       new FieldTemplateTestDescription ("BoolArray_Column"),
+                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/System.String.ascx"),
+               };
+
+               public static readonly List<string> NonDefaultShortTypeNameTemplates = new List<string> () {
+                       "Char.ascx",
+                       "Char.ascx.cs",
+                       "Byte.ascx",
+                       "Byte.ascx.cs",
+                       "Int16.ascx",
+                       "Int16.ascx.cs",
+                       "Int32.ascx",
+                       "Int32.ascx.cs",
+                       "Int64.ascx",
+                       "Int64.ascx.cs",
+                       "String.ascx",
+                       "String.ascx.cs",
+                       "UInt16.ascx",
+                       "UInt16.ascx.cs",
+                       "UInt32.ascx",
+                       "UInt32.ascx.cs",
+                       "UInt64.ascx",
+                       "UInt64.ascx.cs",
+                       "SByte.ascx",
+                       "SByte.ascx.cs",
+                       "Object.ascx",
+                       "Object.ascx.cs",
+                       "Byte[].ascx",
+                       "Byte[].ascx.cs",
+                       "FooEmpty.ascx",
+                       "FooEmpty.ascx.cs",
+                       "ICollection.ascx",
+                       "ICollection.ascx.cs",
+               };
+
+               public static readonly List<FieldTemplateTestDescription> FieldTemplateNonDefaultShortColumns = new List<FieldTemplateTestDescription> ()
+               {
+                       new FieldTemplateTestDescription ("FooEmpty_Column", "~/DynamicData/FieldTemplates/FooEmpty.ascx"),
+                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Char.ascx"),
+                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Byte.ascx"),
+                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Int32.ascx"),
+                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Int64.ascx"),
+                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean.ascx"),
+                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
+                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/String.ascx"),
+                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/String.ascx"),
+                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/String.ascx"),
+                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/String.ascx"),
+                       new FieldTemplateTestDescription ("SByte_Column", "~/DynamicData/FieldTemplates/SByte.ascx"),
+                       new FieldTemplateTestDescription ("UInt_Column", "~/DynamicData/FieldTemplates/UInt32.ascx"),
+                       new FieldTemplateTestDescription ("ULong_Column", "~/DynamicData/FieldTemplates/UInt64.ascx"),
+                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Int16.ascx"),
+                       new FieldTemplateTestDescription ("UShort_Column", "~/DynamicData/FieldTemplates/UInt16.ascx"),
+                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"),
+                       new FieldTemplateTestDescription ("Object_Column", "~/DynamicData/FieldTemplates/Object.ascx"),
+                       new FieldTemplateTestDescription ("ByteArray_Column", "~/DynamicData/FieldTemplates/Byte[].ascx"),
+                       new FieldTemplateTestDescription ("IntArray_Column"),
+                       new FieldTemplateTestDescription ("StringArray_Column"),
+                       new FieldTemplateTestDescription ("ObjectArray_Column"),
+                       new FieldTemplateTestDescription ("StringList_Column"),
+
+                       // Doesn't work for some reason
+                       //new FieldTemplateTestDescription ("StringList_Column", "~/DynamicData/FieldTemplates/List`1[System.String].ascx"),
+                       new FieldTemplateTestDescription ("Dictionary_Column"),
+                       new FieldTemplateTestDescription ("ICollection_Column", "~/DynamicData/FieldTemplates/ICollection.ascx"),
+                       new FieldTemplateTestDescription ("IEnumerable_Column"),
+                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
+                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
+                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
+                       new FieldTemplateTestDescription ("BoolArray_Column"),
+                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/String.ascx"),
+               };
+
+               public static void SetUp_ShortTypeNameTemplates (object caller)
+               {
+                       if (caller == null)
+                               throw new ArgumentNullException ("caller");
+                       Type type = caller.GetType ();
+                       foreach (string tname in NonDefaultShortTypeNameTemplates)
+                               WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault." + tname, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
+               }
+
+               public static void CleanUp_ShortTypeNameTemplates ()
+               {
+                       string baseDir = WebTest.TestBaseDir;
+                       string filePath;
+
+                       foreach (string tname in NonDefaultShortTypeNameTemplates) {
+                               filePath = Path.Combine (baseDir, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
+                               try {
+                                       if (File.Exists (filePath))
+                                               File.Delete (filePath);
+                               } catch {
+                                       // ignore
+                               }
+                       }
+               }
+
+               public static void SetUp_FullTypeNameTemplates (object caller)
+               {
+                       if (caller == null)
+                               throw new ArgumentNullException ("caller");
+                       Type type = caller.GetType ();
+                       foreach (string tname in NonDefaultFullTypeNameTemplates)
+                               WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault." + tname, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
+               }
+
+               public static void CleanUp_FullTypeNameTemplates ()
+               {
+                       string baseDir = WebTest.TestBaseDir;
+                       string filePath;
+
+                       foreach (string tname in NonDefaultFullTypeNameTemplates) {
+                               filePath = Path.Combine (baseDir, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
+                               try {
+                                       if (File.Exists (filePath))
+                                               File.Delete (filePath);
+                               } catch {
+                                       // ignore
+                               }
+                       }
+               }
+       }
+}
diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FieldTemplateTestDescription.cs b/mcs/class/System.Web.DynamicData/Test/Common/FieldTemplateTestDescription.cs
new file mode 100644 (file)
index 0000000..0a033b7
--- /dev/null
@@ -0,0 +1,25 @@
+using System;
+
+
+namespace MonoTests.Common
+{
+       sealed class FieldTemplateTestDescription
+       {
+               public string ColumnName { get; private set; }
+               public string ControlVirtualPath { get; private set; }
+               public bool IsNull { get; private set; }
+
+               public FieldTemplateTestDescription (string columnName)
+                       : this (columnName, String.Empty, true) { }
+
+               public FieldTemplateTestDescription (string columnName, string virtualPath)
+                       : this (columnName, virtualPath, false) { }
+
+               public FieldTemplateTestDescription (string columnName, string virtualPath, bool isNull)
+               {
+                       ColumnName = columnName;
+                       ControlVirtualPath = virtualPath;
+                       IsNull = isNull;
+               }
+       }
+}
diff --git a/mcs/class/System.Web.DynamicData/Test/Common/PokerFieldTemplateUserControl.cs b/mcs/class/System.Web.DynamicData/Test/Common/PokerFieldTemplateUserControl.cs
new file mode 100644 (file)
index 0000000..b2581e0
--- /dev/null
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Web.DynamicData;
+
+namespace MonoTests.Common
+{
+       public class PokerFieldTemplateUserControl : FieldTemplateUserControl
+       {
+               public string GetChildrenPath ()
+               {
+                       return ChildrenPath;
+               }
+
+               public string GetForeignKeyPath ()
+               {
+                       return ForeignKeyPath;
+               }
+
+               public string CallBuildChildrenPath (string path)
+               {
+                       return BuildChildrenPath (path);
+               }
+       }
+}
diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext3.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext3.cs
new file mode 100644 (file)
index 0000000..dbe77c5
--- /dev/null
@@ -0,0 +1,84 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Web.DynamicData;
+using System.Web.DynamicData.ModelProviders;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+using MonoTests.System.Web.DynamicData;
+using MonoTests.ModelProviders;
+using MonoTests.DataSource;
+
+namespace MonoTests.Common
+{
+       public class TestDataContext3 : ITestDataContext
+       {
+               List<AssociatedFoo> associatedFoo;
+               List<AssociatedBar> associatedBar;
+               List<BazWithDataTypeAttribute> bazWithDataTypeAttribute;
+
+               public List<AssociatedFoo> AssociatedFoo
+               {
+                       get
+                       {
+                               if (associatedFoo == null)
+                                       associatedFoo = new List<AssociatedFoo> ();
+
+                               return associatedFoo;
+                       }
+               }
+
+               public List<AssociatedBar> AssociatedBar
+               {
+                       get
+                       {
+                               if (associatedBar == null)
+                                       associatedBar = new List<AssociatedBar> ();
+
+                               return associatedBar;
+                       }
+               }
+
+               public List<BazWithDataTypeAttribute> BazWithDataTypeAttribute
+               {
+                       get
+                       {
+                               if (bazWithDataTypeAttribute == null)
+                                       bazWithDataTypeAttribute = new List<BazWithDataTypeAttribute> ();
+
+                               return bazWithDataTypeAttribute;
+                       }
+               }
+
+               #region ITestDataContext Members
+               public IList GetTableData (string tableName, DataSourceSelectArguments args, string where, ParameterCollection whereParams)
+               {
+                       if (String.Compare (tableName, "AssociatedFooTable", StringComparison.OrdinalIgnoreCase) == 0)
+                               return AssociatedFoo;
+
+                       if (String.Compare (tableName, "AssociatedBarTable", StringComparison.OrdinalIgnoreCase) == 0)
+                               return AssociatedBar;
+
+                       if (String.Compare (tableName, "BazWithDataTypeAttributeTable", StringComparison.OrdinalIgnoreCase) == 0)
+                               return BazWithDataTypeAttribute;
+
+                       return null;
+               }
+
+               public List<DynamicDataTable> GetTables ()
+               {
+                       return new List<DynamicDataTable> {
+                               new TestDataTable<AssociatedBar>(),
+                               new TestDataTable<AssociatedFoo>(),
+                               new TestDataTable<BazWithDataTypeAttribute> ()
+                       };
+               }
+
+               #endregion
+       }
+}
+
index 64f05ec072fd065d177a52cd3230fb7de8bbb3bf..a0c023ba8de751ee1e631d3884c1dfd2fa47dc53 100644 (file)
@@ -75,7 +75,7 @@ namespace MonoTests.ModelProviders
                        }
                }
 
-               void ResolveAssociations ()
+               public void ResolveAssociations ()
                {
                        foreach (var t in Tables) {
                                var table = t as DynamicDataContainerTableProvider <TContext>;
index eb2767ad04a47e650eecbf98cf45097c4d38c3cc..0e1f3b5d68a962c06900e0382570015755aed621 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-15  Marek Habersack  <mhabersack@novell.com>
+
+       * FieldTemplateFactoryTest.cs: implemented tests for
+       BuildVirtualPath, GetFieldTemplateVirtualPath and PreprocessMode.
+
 2009-09-10  Marek Habersack  <mhabersack@novell.com>
 
        * DynamicControlTest.cs: added seveal tests for DataField and UIHint
index c119892a402e656e09af76c2651cfb7dd99f3c78..dc216f65c12e1f5375e20124dd0ce360d44856be 100644 (file)
@@ -67,34 +67,12 @@ namespace MonoTests.System.Web.DynamicData
        [TestFixture]
        public class DynamicControlTest
        {
-               sealed class FieldTemplateTestDescription
-               {
-                       public string ColumnName { get; private set; }
-                       public string ControlVirtualPath { get; private set; }
-                       public bool IsNull { get; private set; }
-
-                       public FieldTemplateTestDescription (string columnName)
-                               : this (columnName, String.Empty, true)
-                       { }
-
-                       public FieldTemplateTestDescription (string columnName, string virtualPath)
-                               : this (columnName, virtualPath, false)
-                       { }
-
-                       public FieldTemplateTestDescription (string columnName, string virtualPath, bool isNull)
-                       {
-                               ColumnName = columnName;
-                               ControlVirtualPath = virtualPath;
-                               IsNull = isNull;
-                       }
-               }
-
                [SetUp]
                public void PerTestSetUp ()
                {
                        // This is ran before every test
-                       CleanUp_FullTypeNameTemplates ();
-                       CleanUp_ShortTypeNameTemplates ();
+                       FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
+                       FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
                }
 
                [TestFixtureSetUp]
@@ -122,8 +100,8 @@ namespace MonoTests.System.Web.DynamicData
                [TestFixtureTearDown]
                public void TearDown ()
                {
-                       CleanUp_FullTypeNameTemplates ();
-                       CleanUp_ShortTypeNameTemplates ();
+                       FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
+                       FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
                        WebTest.Unload ();
                }
 
@@ -486,48 +464,13 @@ namespace MonoTests.System.Web.DynamicData
                        Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
                }
 
-               static List<FieldTemplateTestDescription> fieldTemplateReadOnlyColumns = new List<FieldTemplateTestDescription> ()
-               {
-                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean.ascx"),
-                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("SByte_Column"),
-                       new FieldTemplateTestDescription ("UInt_Column"),
-                       new FieldTemplateTestDescription ("ULong_Column"),
-                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("UShort_Column"),
-                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"),
-                       new FieldTemplateTestDescription ("FooEmpty_Column"),
-                       new FieldTemplateTestDescription ("Object_Column"),
-                       new FieldTemplateTestDescription ("ByteArray_Column"),
-                       new FieldTemplateTestDescription ("IntArray_Column"),
-                       new FieldTemplateTestDescription ("StringArray_Column"),
-                       new FieldTemplateTestDescription ("ObjectArray_Column"),
-                       new FieldTemplateTestDescription ("StringList_Column"),
-                       new FieldTemplateTestDescription ("Dictionary_Column"),
-                       new FieldTemplateTestDescription ("ICollection_Column"),
-                       new FieldTemplateTestDescription ("IEnumerable_Column"),
-                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
-                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
-                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
-                       new FieldTemplateTestDescription ("BoolArray_Column"),
-                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/Text.ascx"),
-               };
-
                static void FieldTemplate_OnLoad (Page p)
                {
                        var lc = p.FindControl ("ListView3") as ListView;
                        Assert.IsNotNull (lc, "#A1");
 
                        int counter = 1;
-                       foreach (var entry in fieldTemplateReadOnlyColumns) {
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateReadOnlyColumns) {
                                string columnName = entry.ColumnName;
                                var dc = lc.FindChild<PokerDynamicControl> (columnName);
                                Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1}", counter, columnName));
@@ -570,48 +513,13 @@ namespace MonoTests.System.Web.DynamicData
                        Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
                }
 
-               static List<FieldTemplateTestDescription> fieldTemplateEditColumns = new List<FieldTemplateTestDescription> ()
-               {
-                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Text_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean_Edit.ascx"),
-                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
-                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"),
-                       new FieldTemplateTestDescription ("SByte_Column"),
-                       new FieldTemplateTestDescription ("UInt_Column"),
-                       new FieldTemplateTestDescription ("ULong_Column"),
-                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"),
-                       new FieldTemplateTestDescription ("UShort_Column"),
-                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime_Edit.ascx"),
-                       new FieldTemplateTestDescription ("FooEmpty_Column"),
-                       new FieldTemplateTestDescription ("Object_Column"),
-                       new FieldTemplateTestDescription ("ByteArray_Column"),
-                       new FieldTemplateTestDescription ("IntArray_Column"),
-                       new FieldTemplateTestDescription ("StringArray_Column"),
-                       new FieldTemplateTestDescription ("ObjectArray_Column"),
-                       new FieldTemplateTestDescription ("StringList_Column"),
-                       new FieldTemplateTestDescription ("Dictionary_Column"),
-                       new FieldTemplateTestDescription ("ICollection_Column"),
-                       new FieldTemplateTestDescription ("IEnumerable_Column"),
-                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
-                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
-                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
-                       new FieldTemplateTestDescription ("BoolArray_Column"),
-                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/MultilineText_Edit.ascx"),
-               };
-
                static void FieldTemplate_OnPreRenderComplete_1 (Page p)
                {
                        var lc = p.FindControl ("ListView4") as ListView;
                        Assert.IsNotNull (lc, "#A1");
 
                        int counter = 1;
-                       foreach (var entry in fieldTemplateEditColumns) {
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateEditColumns) {
                                string columnName = entry.ColumnName;
                                var dc = lc.FindChild<PokerDynamicControl> (columnName);
                                Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
@@ -636,123 +544,24 @@ namespace MonoTests.System.Web.DynamicData
                [Test]
                public void FieldTemplate_2 ()
                {
-                       try {
-                               SetUp_FullTypeNameTemplates ();
-                               var test = new WebTest ("ListView_DynamicControl_03.aspx");
-                               test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_2);
-                               var p = test.Run ();
-                               Assert.IsNotNull (test.Response, "#X1");
-                               Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
-                               Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
-                               Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
-                       } finally {
-
-                       }
-               }
-
-               static List<string> nonDefaultFullTypeNameTemplates = new List<string> () {
-                       "System.Char.ascx",
-                       "System.Char.ascx.cs",
-                       "System.Byte.ascx",
-                       "System.Byte.ascx.cs",
-                       "System.Boolean.ascx",
-                       "System.Boolean.ascx.cs",
-                       "System.Int16.ascx",
-                       "System.Int16.ascx.cs",
-                       "System.Int32.ascx",
-                       "System.Int32.ascx.cs",
-                       "System.Int64.ascx",
-                       "System.Int64.ascx.cs",
-                       "System.String.ascx",
-                       "System.String.ascx.cs",
-                       "System.UInt16.ascx",
-                       "System.UInt16.ascx.cs",
-                       "System.UInt32.ascx",
-                       "System.UInt32.ascx.cs",
-                       "System.UInt64.ascx",
-                       "System.UInt64.ascx.cs",
-                       "System.SByte.ascx",
-                       "System.SByte.ascx.cs",
-                       "System.Object.ascx",
-                       "System.Object.ascx.cs",
-                       "System.Byte[].ascx",
-                       "System.Byte[].ascx.cs",
-                       "System.Collections.Generic.List`1[System.String].ascx",
-                       "System.Collections.Generic.List`1[System.String].ascx.cs",
-                       "MonoTests.Common.FooEmpty.ascx",
-                       "MonoTests.Common.FooEmpty.ascx.cs",
-                       "System.Collections.ICollection.ascx",
-                       "System.Collections.ICollection.ascx.cs",
-               };
-
-               void SetUp_FullTypeNameTemplates ()
-               {
-                       Type type = GetType ();
-                       foreach (string tname in nonDefaultFullTypeNameTemplates)
-                               WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault." + tname, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
-               }
+                       FieldTemplatePathTables.SetUp_FullTypeNameTemplates (this);
+                       var test = new WebTest ("ListView_DynamicControl_03.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_2);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
 
-               void CleanUp_FullTypeNameTemplates ()
-               {
-                       string baseDir = WebTest.TestBaseDir;
-                       string filePath;
-
-                       foreach (string tname in nonDefaultFullTypeNameTemplates) {
-                               filePath = Path.Combine (baseDir, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
-                               try {
-                                       if (File.Exists (filePath))
-                                               File.Delete (filePath);
-                               } catch {
-                                       // ignore
-                               }
-                       }
                }
 
-               static List<FieldTemplateTestDescription> fieldTemplateNonDefaultColumns = new List<FieldTemplateTestDescription> ()
-               {
-                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/System.Char.ascx"),
-                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/System.Byte.ascx"),
-                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/System.Int32.ascx"),
-                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/System.Int64.ascx"),
-                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/System.Boolean.ascx"),
-                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
-                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
-                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
-                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/System.String.ascx"),
-                       new FieldTemplateTestDescription ("SByte_Column", "~/DynamicData/FieldTemplates/System.SByte.ascx"),
-                       new FieldTemplateTestDescription ("UInt_Column", "~/DynamicData/FieldTemplates/System.UInt32.ascx"),
-                       new FieldTemplateTestDescription ("ULong_Column", "~/DynamicData/FieldTemplates/System.UInt64.ascx"),
-                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/System.Int16.ascx"),
-                       new FieldTemplateTestDescription ("UShort_Column", "~/DynamicData/FieldTemplates/System.UInt16.ascx"),
-                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"),
-                       new FieldTemplateTestDescription ("FooEmpty_Column", "~/DynamicData/FieldTemplates/MonoTests.Common.FooEmpty.ascx"),
-                       new FieldTemplateTestDescription ("Object_Column", "~/DynamicData/FieldTemplates/System.Object.ascx"),
-                       new FieldTemplateTestDescription ("ByteArray_Column", "~/DynamicData/FieldTemplates/System.Byte[].ascx"),
-                       new FieldTemplateTestDescription ("IntArray_Column"),
-                       new FieldTemplateTestDescription ("StringArray_Column"),
-                       new FieldTemplateTestDescription ("ObjectArray_Column"),
-                       new FieldTemplateTestDescription ("StringList_Column"),
-
-                       // Doesn't work for some reason
-                       //new FieldTemplateTestDescription ("StringList_Column", "~/DynamicData/FieldTemplates/System.Collections.Generic.List`1[System.String].ascx"),
-                       new FieldTemplateTestDescription ("Dictionary_Column"),
-                       new FieldTemplateTestDescription ("ICollection_Column", "~/DynamicData/FieldTemplates/System.Collections.ICollection.ascx"),
-                       new FieldTemplateTestDescription ("IEnumerable_Column"),
-                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
-                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
-                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
-                       new FieldTemplateTestDescription ("BoolArray_Column"),
-                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/System.String.ascx"),
-               };
-
                static void FieldTemplate_OnLoad_2 (Page p)
                {
                        var lc = p.FindControl ("ListView3") as ListView;
                        Assert.IsNotNull (lc, "#A1");
 
                        int counter = 1;
-                       foreach (var entry in fieldTemplateNonDefaultColumns) {
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultColumns) {
                                string columnName = entry.ColumnName;
                                var dc = lc.FindChild<PokerDynamicControl> (columnName);
                                Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
@@ -778,7 +587,7 @@ namespace MonoTests.System.Web.DynamicData
                public void FieldTemplate_3 ()
                {
                        try {
-                               SetUp_ShortTypeNameTemplates ();
+                               FieldTemplatePathTables.SetUp_ShortTypeNameTemplates (this);
                                var test = new WebTest ("ListView_DynamicControl_03.aspx");
                                test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_3);
                                var p = test.Run ();
@@ -791,105 +600,13 @@ namespace MonoTests.System.Web.DynamicData
                        }
                }
 
-               static List<string> nonDefaultShortTypeNameTemplates = new List<string> () {
-                       "Char.ascx",
-                       "Char.ascx.cs",
-                       "Byte.ascx",
-                       "Byte.ascx.cs",
-                       "Int16.ascx",
-                       "Int16.ascx.cs",
-                       "Int32.ascx",
-                       "Int32.ascx.cs",
-                       "Int64.ascx",
-                       "Int64.ascx.cs",
-                       "String.ascx",
-                       "String.ascx.cs",
-                       "UInt16.ascx",
-                       "UInt16.ascx.cs",
-                       "UInt32.ascx",
-                       "UInt32.ascx.cs",
-                       "UInt64.ascx",
-                       "UInt64.ascx.cs",
-                       "SByte.ascx",
-                       "SByte.ascx.cs",
-                       "Object.ascx",
-                       "Object.ascx.cs",
-                       "Byte[].ascx",
-                       "Byte[].ascx.cs",
-                       "FooEmpty.ascx",
-                       "FooEmpty.ascx.cs",
-                       "ICollection.ascx",
-                       "ICollection.ascx.cs",
-               };
-
-               void SetUp_ShortTypeNameTemplates ()
-               {
-                       Type type = GetType ();
-                       foreach (string tname in nonDefaultShortTypeNameTemplates)
-                               WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault." + tname, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
-               }
-
-               void CleanUp_ShortTypeNameTemplates ()
-               {
-                       string baseDir = WebTest.TestBaseDir;
-                       string filePath;
-
-                       foreach (string tname in nonDefaultShortTypeNameTemplates) {
-                               filePath = Path.Combine (baseDir, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname));
-                               try {
-                                       if (File.Exists (filePath))
-                                               File.Delete (filePath);
-                               } catch {
-                                       // ignore
-                               }
-                       }
-               }
-
-               static List<FieldTemplateTestDescription> fieldTemplateNonDefaultShortColumns = new List<FieldTemplateTestDescription> ()
-               {
-                       new FieldTemplateTestDescription ("FooEmpty_Column", "~/DynamicData/FieldTemplates/FooEmpty.ascx"),
-                       new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Char.ascx"),
-                       new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Byte.ascx"),
-                       new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Int32.ascx"),
-                       new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Int64.ascx"),
-                       new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean.ascx"),
-                       new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"),
-                       new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/String.ascx"),
-                       new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/String.ascx"),
-                       new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/String.ascx"),
-                       new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/String.ascx"),
-                       new FieldTemplateTestDescription ("SByte_Column", "~/DynamicData/FieldTemplates/SByte.ascx"),
-                       new FieldTemplateTestDescription ("UInt_Column", "~/DynamicData/FieldTemplates/UInt32.ascx"),
-                       new FieldTemplateTestDescription ("ULong_Column", "~/DynamicData/FieldTemplates/UInt64.ascx"),
-                       new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Int16.ascx"),
-                       new FieldTemplateTestDescription ("UShort_Column", "~/DynamicData/FieldTemplates/UInt16.ascx"),
-                       new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"),
-                       new FieldTemplateTestDescription ("Object_Column", "~/DynamicData/FieldTemplates/Object.ascx"),
-                       new FieldTemplateTestDescription ("ByteArray_Column", "~/DynamicData/FieldTemplates/Byte[].ascx"),
-                       new FieldTemplateTestDescription ("IntArray_Column"),
-                       new FieldTemplateTestDescription ("StringArray_Column"),
-                       new FieldTemplateTestDescription ("ObjectArray_Column"),
-                       new FieldTemplateTestDescription ("StringList_Column"),
-
-                       // Doesn't work for some reason
-                       //new FieldTemplateTestDescription ("StringList_Column", "~/DynamicData/FieldTemplates/List`1[System.String].ascx"),
-                       new FieldTemplateTestDescription ("Dictionary_Column"),
-                       new FieldTemplateTestDescription ("ICollection_Column", "~/DynamicData/FieldTemplates/ICollection.ascx"),
-                       new FieldTemplateTestDescription ("IEnumerable_Column"),
-                       new FieldTemplateTestDescription ("ICollectionByte_Column"),
-                       new FieldTemplateTestDescription ("IEnumerableByte_Column"),
-                       new FieldTemplateTestDescription ("ByteMultiArray_Column"),
-                       new FieldTemplateTestDescription ("BoolArray_Column"),
-                       new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/String.ascx"),
-               };
-
                static void FieldTemplate_OnLoad_3 (Page p)
                {
                        var lc = p.FindControl ("ListView3") as ListView;
                        Assert.IsNotNull (lc, "#A1");
 
                        int counter = 1;
-                       foreach (var entry in fieldTemplateNonDefaultShortColumns) {
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultShortColumns) {
                                string columnName = entry.ColumnName;
                                var dc = lc.FindChild<PokerDynamicControl> (columnName);
                                Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
index 7ac0cd3eb6b0eb46df2dda5aec5e6c7ae240624f..78b1974bbf06027c88b330ab5a3738e5b59d5317 100644 (file)
@@ -76,6 +76,12 @@ namespace MonoTests.System.Web.DynamicData
                        Type type = GetType ();
                        WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx", "ListView_DynamicControl_01.aspx");
                        WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx.cs", "ListView_DynamicControl_01.aspx.cs");
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx", "ListView_DynamicControl_03.aspx");
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx.cs", "ListView_DynamicControl_03.aspx.cs");
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx", "ListView_DynamicControl_04.aspx");
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx.cs", "ListView_DynamicControl_04.aspx.cs");
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_09.aspx", "ListView_DynamicControl_09.aspx");
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_09.aspx.cs", "ListView_DynamicControl_09.aspx.cs");
 
                        dynamicModelProvider = new DynamicDataContainerModelProvider<TestDataContext> ();
                        Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true });
@@ -84,9 +90,19 @@ namespace MonoTests.System.Web.DynamicData
                [TestFixtureTearDown]
                public void TearDown ()
                {
+                       FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
+                       FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
                        WebTest.Unload ();
                }
 
+               [SetUp]
+               public void PerTestSetUp ()
+               {
+                       // This is ran before every test
+                       FieldTemplatePathTables.CleanUp_FullTypeNameTemplates ();
+                       FieldTemplatePathTables.CleanUp_ShortTypeNameTemplates ();
+               }
+
                [Test]
                public void Defaults ()
                {
@@ -134,6 +150,20 @@ namespace MonoTests.System.Web.DynamicData
                        Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer_Insert.ascx", ftf.BuildVirtualPath ("Integer", mc, DataBoundControlMode.Insert), "#B4");
                        Assert.AreEqual (ftf.TemplateFolderVirtualPath + "NoSuchTemplate.ascx", ftf.BuildVirtualPath ("NoSuchTemplate", mc, DataBoundControlMode.ReadOnly), "#B5");
                        Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer.ascx", ftf.BuildVirtualPath ("Integer", null, DataBoundControlMode.ReadOnly), "#B6");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Integer.ascx", ftf.BuildVirtualPath ("Integer", mc, (DataBoundControlMode)10), "#B7");
+               }
+
+               [Test]
+               public void BuildVirtualPath_1 ()
+               {
+                       MetaModel m = Utils.CommonInitialize ();
+                       MetaTable t = m.Tables[TestDataContext.TableBaz];
+                       MetaColumn mc = t.GetColumn ("CustomUIHintColumn");
+
+                       var ftf = new FieldTemplateFactory ();
+
+                       // It seems MetaColumn.UIHint is ignored (or rather it suggests that column is not used at all)
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Test.ascx", ftf.BuildVirtualPath ("Test", mc, DataBoundControlMode.ReadOnly), "#A1");
                }
 
                [Test]
@@ -234,7 +264,7 @@ namespace MonoTests.System.Web.DynamicData
                }
 
                [Test]
-               public static void GetFieldTemplateVirtualPath ()
+               public void GetFieldTemplateVirtualPath ()
                {
                        // This test is (sort of) bogus as the .NET code completely falls apart when invoked outside
                        // real web request environment. Talk about code testability...
@@ -268,10 +298,10 @@ namespace MonoTests.System.Web.DynamicData
                }
 
                [Test]
-               public void GetFieldTemplateVirtualPath_2 ()
+               public void GetFieldTemplateVirtualPath_02 ()
                {
                        var test = new WebTest ("ListView_DynamicControl_01.aspx");
-                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_2);
+                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_02);
                        var p = test.Run ();
                        Assert.IsNotNull (test.Response, "#X1");
                        Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
@@ -279,7 +309,7 @@ namespace MonoTests.System.Web.DynamicData
                        Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
                }
 
-               static void GetFieldTemplateVirtualPath_OnLoad_2 (Page p)
+               static void GetFieldTemplateVirtualPath_OnLoad_02 (Page p)
                {
                        MetaModel m = MetaModel.Default;
                        MetaTable t = m.GetTable ("EmployeeTable");
@@ -305,6 +335,509 @@ namespace MonoTests.System.Web.DynamicData
                        templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "MyCustomUIHintTemplate_Text");
                        Assert.IsNotNull (templatePath, "#E1");
                        Assert.AreEqual (ftf.TemplateFolderVirtualPath + "MyCustomUIHintTemplate_Text.ascx", templatePath, "#E1-2");
+
+                       mc = t.GetColumn ("LastName");
+                       Assert.AreEqual ("CustomFieldTemplate", mc.UIHint, "#F1");
+                       templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#F1-1");
+
+                       templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "CustomFieldTemplate");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "CustomFieldTemplate.ascx", templatePath, "#F2");
+               }
+
+               [Test]
+               public void GetFieldTemplateVirtualPath_03 ()
+               {
+                       var test = new WebTest ("ListView_DynamicControl_09.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_03);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void GetFieldTemplateVirtualPath_OnLoad_03 (Page p)
+               {
+                       MetaModel m = MetaModel.Default;
+                       MetaTable t = m.GetTable ("AssociatedFooTable");
+                       MetaColumn mc = t.GetColumn ("PrimaryKeyColumn2");
+
+                       Assert.AreEqual (typeof (MetaChildrenColumn), mc.GetType (), "#A1");
+
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (m);
+
+                       string templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Text.ascx");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#A2");
+
+                       templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Children.ascx", templatePath, "#A3");
+
+                       // When MetaColumn.DataTypeAttribute is not null (which will always be the case for string columns), column type is ignored
+                       mc = t.GetColumn ("ForeignKeyColumn1");
+                       Assert.AreEqual (typeof (MetaForeignKeyColumn), mc.GetType (), "#B1");
+                       Assert.IsNotNull (mc.DataTypeAttribute, "#B1-1");
+
+                       ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (m);
+
+                       templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Text.ascx");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#B2");
+
+                       templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#B3");
+
+                       mc = t.GetColumn ("ForeignKeyColumn2");
+                       Assert.AreEqual (typeof (MetaForeignKeyColumn), mc.GetType (), "#C1");
+                       Assert.IsNull (mc.DataTypeAttribute, "#C1-1");
+
+                       ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (m);
+
+                       templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Text.ascx");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", templatePath, "#C2");
+
+                       templatePath = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "ForeignKey.ascx", templatePath, "#C3");
+               }
+
+               [Test]
+               public void GetFieldTemplateVirtualPath_04 ()
+               {
+                       var test = new WebTest ("ListView_DynamicControl_03.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_04);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void GetFieldTemplateVirtualPath_OnLoad_04 (Page p)
+               {
+                       var lc = p.FindControl ("ListView3") as ListView;
+                       Assert.IsNotNull (lc, "#A1");
+
+                       int counter = 1;
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (MetaModel.Default);
+
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateReadOnlyColumns) {
+                               string columnName = entry.ColumnName;
+                               var dc = lc.FindChild<PokerDynamicControl> (columnName);
+                               Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
+                               Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
+
+                               string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.ReadOnly, null);
+                               if (entry.IsNull)
+                                       Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
+                               else {
+                                       Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
+                                       Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
+                               }
+
+                               counter++;
+                       }
+               }
+
+               [Test]
+               public void GetFieldTemplateVirtualPath_05 ()
+               {
+                       var test = new WebTest ("ListView_DynamicControl_04.aspx");
+                       var p = test.Run ();
+
+                       // Fake post-back
+                       var delegates = new PageDelegates ();
+                       delegates.PreRenderComplete = GetFieldTemplateVirtualPath_OnPreRenderComplete_05;
+                       test.Invoker = new PageInvoker (delegates);
+                       var fr = new FormRequest (test.Response, "form1");
+#if TARGET_DOTNET
+                       fr.Controls.Add ("ListView4$ctrl0$editMe");
+                       fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
+#else
+                       fr.Controls.Add ("ListView4$ctl01$editMe");
+                       fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
+#endif
+                       test.Request = fr;
+                       p = test.Run ();
+
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void GetFieldTemplateVirtualPath_OnPreRenderComplete_05 (Page p)
+               {
+                       var lc = p.FindControl ("ListView4") as ListView;
+                       Assert.IsNotNull (lc, "#A1");
+
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (MetaModel.Default);
+                       int counter = 1;
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateEditColumns) {
+                               string columnName = entry.ColumnName;
+                               var dc = lc.FindChild<PokerDynamicControl> (columnName);
+                               Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
+                               Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
+
+                               string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.Edit, null);
+                               if (entry.IsNull)
+                                       Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
+                               else {
+                                       Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
+                                       Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
+                               }
+
+                               counter++;
+                       }
+               }
+
+               // This tests full type name templates
+               [Test]
+               public void GetFieldTemplateVirtualPath_06 ()
+               {
+                       FieldTemplatePathTables.SetUp_FullTypeNameTemplates (this);
+                       var test = new WebTest ("ListView_DynamicControl_03.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_06);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void GetFieldTemplateVirtualPath_OnLoad_06 (Page p)
+               {
+                       var lc = p.FindControl ("ListView3") as ListView;
+                       Assert.IsNotNull (lc, "#A1");
+
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (MetaModel.Default);
+                       int counter = 1;
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultColumns) {
+                               string columnName = entry.ColumnName;
+                               var dc = lc.FindChild<PokerDynamicControl> (columnName);
+                               Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
+                               Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
+
+                               string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.ReadOnly, null);
+                               if (entry.IsNull)
+                                       Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
+                               else {
+                                       Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
+                                       Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
+                               }
+
+                               counter++;
+                       }
+               }
+
+               // This tests short type name templates
+               [Test]
+               public void GetFieldTemplateVirtualPath_07 ()
+               {
+                       FieldTemplatePathTables.SetUp_ShortTypeNameTemplates (this);
+                       var test = new WebTest ("ListView_DynamicControl_03.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_07);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void GetFieldTemplateVirtualPath_OnLoad_07 (Page p)
+               {
+                       var lc = p.FindControl ("ListView3") as ListView;
+                       Assert.IsNotNull (lc, "#A1");
+
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (MetaModel.Default);
+                       int counter = 1;
+                       foreach (var entry in FieldTemplatePathTables.FieldTemplateNonDefaultShortColumns) {
+                               string columnName = entry.ColumnName;
+                               var dc = lc.FindChild<PokerDynamicControl> (columnName);
+                               Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName));
+                               Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName));
+
+                               string path = ftf.GetFieldTemplateVirtualPath (dc.Column, DataBoundControlMode.ReadOnly, null);
+                               if (entry.IsNull)
+                                       Assert.IsNull (path, String.Format ("#B{0}-3 ({1})", counter, columnName));
+                               else {
+                                       Assert.IsNotNull (path, String.Format ("#B{0}-4 ({1})", counter, columnName));
+                                       Assert.AreEqual (entry.ControlVirtualPath, path, String.Format ("#B{0}-5 ({1})", counter, columnName));
+                               }
+
+                               counter++;
+                       }
+               }
+
+               [Test]
+               public void GetFieldTemplateVirtualPath_08 ()
+               {
+                       var test = new WebTest ("ListView_DynamicControl_09.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_08);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void GetFieldTemplateVirtualPath_OnLoad_08 (Page p)
+               {
+                       MetaModel m = MetaModel.Default;
+                       MetaTable t = m.GetTable ("AssociatedFooTable");
+                       MetaColumn mc = t.GetColumn ("PrimaryKeyColumn2");
+
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (m);
+
+                       // Ugh...
+                       AssertExtensions.Throws<NullReferenceException> (() => {
+                               ftf.GetFieldTemplateVirtualPath (null, DataBoundControlMode.ReadOnly, "Integer.ascx");
+                       }, "#A1");
+
+
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Children.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#A2");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Children.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#A3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate"), "#A4");
+               }
+
+               [Test]
+               public void GetFieldTemplateVirtualPath_09 ()
+               {
+                       var test = new WebTest ("ListView_DynamicControl_09.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (GetFieldTemplateVirtualPath_OnLoad_09);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void GetFieldTemplateVirtualPath_OnLoad_09 (Page p)
+               {
+                       MetaModel m = MetaModel.Default;
+                       MetaTable t = m.GetTable ("BazWithDataTypeAttributeTable");
+                       MetaColumn mc = t.GetColumn ("CustomColumn1");
+
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (m);
+
+                       // Custom type
+                       //   It appears that DataTypeAttribute's custom type name is passed to BuildVirtualPath
+                       AssertExtensions.Throws<ArgumentNullException> (() => {
+                               string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
+                       }, "#A1");
+                       
+                       AssertExtensions.Throws<ArgumentNullException> (() => {
+                               string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
+                       }, "#A1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A1-2");
+
+                       // Custom with UIHint attribute
+                       mc = t.GetColumn ("CustomColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#A2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#A2-1");
+
+                       // Proves that UIHint on the column is not used, just the uiHint argument
+                       AssertExtensions.Throws<ArgumentNullException> (() => {
+                               string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null);
+                       }, "#A2-2");
+
+                       AssertExtensions.Throws<ArgumentNullException> (() => {
+                               string path = ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate");
+                       }, "#A2-3");
+                       
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A2-4");
+
+                       mc = t.GetColumn ("CustomColumn3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#A3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate"), "#A3-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A3-2");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#A3-3");
+
+                       // Custom with UIHint attribute
+                       mc = t.GetColumn ("CustomColumn4");
+                       Assert.IsNotNull (mc.UIHint, "#A4");
+                       Assert.Greater (mc.UIHint.Length, 0, "#A4-1");
+
+                       // Proves that UIHint on the column is not used, just the uiHint argument
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#A4-2");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "NoSuchTemplate"), "#A4-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Boolean.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean"), "#A4-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#A4-5");
+
+                       // DateTime
+                       mc = t.GetColumn ("DateTimeColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#B1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#B1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#B1-2");
+
+                       mc = t.GetColumn ("DateTimeColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#B2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#B2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#B2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#B2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "DateTime.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#B2-5");
+
+                       // Date -> maps to Text.ascx, regardless of underlying type and uiHint passed
+                       mc = t.GetColumn ("DateColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C1-2");
+
+                       mc = t.GetColumn ("DateColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#C2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#C2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C2-5");
+
+                       mc = t.GetColumn ("DateColumn3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C3-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C3-2");
+
+                       mc = t.GetColumn ("DateColumn4");
+                       Assert.IsNotNull (mc.UIHint, "#C4");
+                       Assert.Greater (mc.UIHint.Length, 0, "#C4-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#C4-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#C4-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#C4-5");
+
+                       // Time
+                       mc = t.GetColumn ("TimeColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#D1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#D1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#D1-2");
+
+                       mc = t.GetColumn ("TimeColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#D2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#D2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#D2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#D2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#D2-5");
+
+                       // Duration
+                       mc = t.GetColumn ("DurationColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#E1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#E1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#E1-2");
+
+                       mc = t.GetColumn ("DurationColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#E2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#E2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#E2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#E2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#E2-5");
+
+                       // PhoneNumber
+                       mc = t.GetColumn ("PhoneNumberColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#F1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#F1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#F1-2");
+
+                       mc = t.GetColumn ("PhoneNumberColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#F2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#F2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#F2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#F2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#F2-5");
+
+                       // Currency
+                       mc = t.GetColumn ("CurrencyColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#G1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#G1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#G1-2");
+
+                       mc = t.GetColumn ("CurrencyColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#G2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#G2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#G2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#G2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#G2-5");
+
+                       // Text
+                       mc = t.GetColumn ("TextColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#H1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#H1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#H1-2");
+
+                       mc = t.GetColumn ("TextColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#H2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#H2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#H2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#H2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#H2-5");
+
+                       // Html
+                       mc = t.GetColumn ("HtmlColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#I1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#I1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#I1-2");
+
+                       mc = t.GetColumn ("HtmlColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#I2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#I2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#I2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#I2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#I2-5");
+
+                       // MultilineText
+                       mc = t.GetColumn ("MultilineTextColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#J1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#J1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#J1-2");
+
+                       mc = t.GetColumn ("MultilineTextColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#J2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#J2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#J2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#J2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#J2-5");
+
+                       // EmailAddress
+                       mc = t.GetColumn ("EmailAddressColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#K1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#K1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#K1-2");
+
+                       mc = t.GetColumn ("EmailAddressColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#K2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#K2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#K2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#K2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#K2-5");
+
+                       // Password
+                       mc = t.GetColumn ("PasswordColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#L1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#L1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#L1-2");
+
+                       mc = t.GetColumn ("PasswordColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#L2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#L2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#L2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#L2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#L2-5");
+
+                       // Url
+                       mc = t.GetColumn ("UrlColumn1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#M1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#M1-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#M1-2");
+
+                       mc = t.GetColumn ("UrlColumn2");
+                       Assert.IsNotNull (mc.UIHint, "#M2");
+                       Assert.Greater (mc.UIHint.Length, 0, "#M2-1");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, null), "#M2-3");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, String.Empty), "#M2-4");
+                       Assert.AreEqual (ftf.TemplateFolderVirtualPath + "Text.ascx", ftf.GetFieldTemplateVirtualPath (mc, DataBoundControlMode.ReadOnly, "Boolean.ascx"), "#M2-5");
                }
 
                [Test]
@@ -339,6 +872,80 @@ namespace MonoTests.System.Web.DynamicData
                        Assert.AreEqual (m, ftf.Model, "#A3-1");
                }
 
+               [Test]
+               public void PreprocessMode ()
+               {
+                       MetaModel m = Utils.CommonInitialize ();
+                       MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults];
+                       MetaColumn mc = t.GetColumn ("Column1");
+
+                       var ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (m);
+
+                       AssertExtensions.Throws<NullReferenceException> (() => {
+                               ftf.PreprocessMode (null, DataBoundControlMode.ReadOnly);
+                       }, "#A1");
+
+                       var mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#A2");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
+                       Assert.AreEqual (DataBoundControlMode.Insert, mode, "#A2-1");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
+                       Assert.AreEqual (DataBoundControlMode.Edit, mode, "#A2-2");
+
+                       mc = t.GetColumn ("PrimaryKeyColumn1");
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#B1");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
+                       Assert.AreEqual (DataBoundControlMode.Insert, mode, "#B1-1");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#B1-2");
+
+                       t = m.Tables[TestDataContext.TableAssociatedFoo];
+                       mc = t.GetColumn ("ForeignKeyColumn1");
+
+                       Assert.AreEqual (true, mc.IsForeignKeyComponent, "#C1");
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#C1-1");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
+                       Assert.AreEqual (DataBoundControlMode.Insert, mode, "#C1-2");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
+                       Assert.AreEqual (DataBoundControlMode.Edit, mode, "#C1-3");
+
+                       t = m.Tables[TestDataContext.TableBaz];
+                       mc = t.GetColumn ("GeneratedColumn1");
+
+                       Assert.AreEqual (true, mc.IsGenerated, "#D1");
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-1");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-2");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-3");
+
+                       t = m.Tables[TestDataContext.TableAssociatedFoo];
+                       mc = t.GetColumn ("PrimaryKeyColumn1");
+
+                       Assert.AreEqual (true, mc.IsForeignKeyComponent, "#D1");
+                       Assert.AreEqual (true, mc.IsPrimaryKey, "#D1-1");
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.ReadOnly);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-2");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Insert);
+                       Assert.AreEqual (DataBoundControlMode.Insert, mode, "#D1-3");
+
+                       mode = ftf.PreprocessMode (mc, DataBoundControlMode.Edit);
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, mode, "#D1-4");
+               }
+
                [Test]
                public void TemplateFolderVirtualPath ()
                {
@@ -346,9 +953,6 @@ namespace MonoTests.System.Web.DynamicData
                        var ftf = new FieldTemplateFactory ();
                        string origFolderPath = ftf.TemplateFolderVirtualPath;
 
-                       // It seems accessing TemplateFolderVirtualPath before calling Initialize sets the
-                       // property value to "FieldTemplates/", and the dynamic folder path is ignored later on, so
-                       // we need to start from scratch here.
                        ftf = new FieldTemplateFactory ();
 
                        Assert.AreEqual ("FieldTemplates/", ftf.TemplateFolderVirtualPath, "#A1");
@@ -401,6 +1005,14 @@ namespace MonoTests.System.Web.DynamicData
                        ftf.Initialize (m);
                        m.DynamicDataFolderVirtualPath = "~/MyPath";
                        Assert.AreEqual ("MyFolder/", ftf.TemplateFolderVirtualPath, "#F1");
+
+                       ftf = new FieldTemplateFactory ();
+                       ftf.Initialize (m);
+                       ftf.TemplateFolderVirtualPath = String.Empty;
+
+                       AssertExtensions.Throws<ArgumentNullException> (() => {
+                               string path = ftf.TemplateFolderVirtualPath;
+                       }, "#G1");
                }
        }
 }
diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/FieldTemplateUserControlTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/FieldTemplateUserControlTest.cs
new file mode 100644 (file)
index 0000000..ee9e21a
--- /dev/null
@@ -0,0 +1,201 @@
+//
+// FieldTemplateUserControlTest.cs
+//
+// Authors:
+//      Marek Habersack <mhabersack@novell.com>
+//
+// Copyright (C) 2009 Novell Inc. http://novell.com
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+using System.ComponentModel.DataAnnotations;
+using System.Data.SqlClient;
+using System.Data.Linq;
+using System.Data.Linq.Mapping;
+using System.Globalization;
+using System.Linq;
+using System.Net;
+using System.Reflection;
+using System.Security.Permissions;
+using System.Security.Principal;
+using System.Web;
+using System.Web.UI;
+using System.Web.DynamicData;
+using System.Web.DynamicData.ModelProviders;
+using System.Web.Routing;
+using System.Web.UI.HtmlControls;
+using System.Web.UI.WebControls;
+using System.IO;
+
+using NUnit.Framework;
+using NUnit.Mocks;
+using MonoTests.stand_alone.WebHarness;
+using MonoTests.SystemWeb.Framework;
+using MonoTests.Common;
+using MonoTests.DataSource;
+using MonoTests.DataObjects;
+using MonoTests.ModelProviders;
+
+using MetaModel = System.Web.DynamicData.MetaModel;
+using MetaTable = System.Web.DynamicData.MetaTable;
+
+namespace MonoTests.System.Web.DynamicData
+{
+       [TestFixture]
+       public class FieldTemplateUserControlTest
+       {
+               DynamicDataContainerModelProvider<TestDataContext> dynamicModelProvider;
+
+               [TestFixtureSetUp]
+               public void SetUp ()
+               {
+                       Type type = GetType ();
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx", "ListView_DynamicControl_01.aspx");
+                       WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx.cs", "ListView_DynamicControl_01.aspx.cs");
+
+                       dynamicModelProvider = new DynamicDataContainerModelProvider<TestDataContext> ();
+                       Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true });
+               }
+
+               [TestFixtureTearDown]
+               public void TearDown ()
+               {
+                       WebTest.Unload ();
+               }
+
+               [Test]
+               public void Defaults ()
+               {
+                       var field = new PokerFieldTemplateUserControl ();
+
+                       // And for another time - not a single null check in the code...
+                       //
+                       // All the asserts commented out below throw a NREX
+                       //
+
+                       //Assert.IsNull (field.ChildrenColumn, "#A1");
+                       //Assert.IsNull (field.GetChildrenPath (), "#A2");
+                       //Assert.IsNull (field.Column, "#A3");
+                       Assert.IsNull (field.DataControl, "#A4");
+                       //Assert.IsNull (field.FieldValue, "#A5");
+                       //Assert.IsNull (field.FieldValueEditString, "#A6");
+                       //Assert.IsNull (field.FieldValueString, "#A7");
+                       //Assert.IsNull (field.ForeignKeyColumn, "#A8");
+                       //Assert.IsNull (field.GetForeignKeyPath (), "#A9");
+                       Assert.IsNull (field.Host, "#A10");
+                       //Assert.IsNull (field.MetadataAttributes, "#A11");
+                       //Assert.IsNull (field.Mode, "#A12");
+                       //Assert.IsNull (field.Row, "#A13");
+                       //Assert.IsNull (field.Table, "#A14");
+               }
+
+               [Test]
+               public void Defaults_WithHost ()
+               {
+                       var test = new WebTest ("ListView_DynamicControl_01.aspx");
+                       test.Invoker = PageInvoker.CreateOnLoad (Defaults_WithHost_OnLoad);
+                       var p = test.Run ();
+                       Assert.IsNotNull (test.Response, "#X1");
+                       Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
+                       Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
+               }
+
+               static void Defaults_WithHost_OnLoad (Page p)
+               {
+                       // Not many "defaults" here
+
+                       var lc = p.FindControl ("ListView1") as ListView;
+                       Assert.IsNotNull (lc, "#A1");
+
+                       var dc = lc.FindChild<DynamicControl> ("FirstName");
+                       Assert.IsNotNull (dc, "#B1-1");
+                       Assert.AreEqual ("FirstName", dc.ID, "#B1-2");
+
+                       var field = new PokerFieldTemplateUserControl ();
+
+                       // Without it Row NREXes... However, with Page set, we still get an exception
+                       // this time from Page.GetDataItem () as we're not bound to data. So, there is
+                       // no way to test the "defaults" as if we used a field control retrieved from 
+                       // DataControl it would already be initialized
+                       field.Page = p;
+                       ((IFieldTemplate) field).SetHost (dc);
+
+                       AssertExtensions.Throws<Exception> (() => {
+                               var f = field.ChildrenColumn;
+                       }, "#C1");
+
+                       // The FirstName column is not a children one
+                       AssertExtensions.Throws<Exception> (() => {
+                               field.GetChildrenPath ();
+                       }, "#C2");
+                       Assert.IsNotNull (field.Column, "#C3");
+                       Assert.AreEqual (dc.Column, field.Column, "#C3-1");
+                       Assert.IsNull (field.DataControl, "#C4");
+
+                       // The tests below fail with exception:
+                       //
+                       // MonoTests.System.Web.DynamicData.FieldTemplateUserControlTest.Defaults_WithHost:
+                       // System.InvalidOperationException : System.InvalidOperationException: Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
+                       //   at System.Web.UI.Page.GetDataItem()
+                       //   at System.Web.DynamicData.FieldTemplateUserControl.get_Row()
+                       //   at System.Web.DynamicData.FieldTemplateUserControl.GetColumnValue(MetaColumn column)
+                       //   at System.Web.DynamicData.FieldTemplateUserControl.get_FieldValue()
+                       //   at System.Web.DynamicData.FieldTemplateUserControl.get_FieldValueEditString()
+                       //   at MonoTests.System.Web.DynamicData.FieldTemplateUserControlTest.Defaults_WithHost_OnLoad(Page p)
+                       //   at MonoTests.SystemWeb.Framework.PageInvoker.Invoke(PageDelegate callback)
+                       //   at MonoTests.SystemWeb.Framework.PageInvoker.OnLoad(Object sender, EventArgs a)
+                       //   at System.EventHandler.Invoke(Object sender, EventArgs e)
+                       //   at System.Web.UI.Control.OnLoad(EventArgs e)
+                       //   at System.Web.UI.Control.LoadRecursive()
+                       //   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
+                       //  ----> System.InvalidOperationException : Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
+
+                       //Assert.IsNull (field.FieldValue, "#C5");
+                       //Assert.IsNull (field.FieldValueEditString, "#C6");
+                       //Assert.IsNull (field.FieldValueString, "#C7");
+
+                       // The FirstName column is not a foreign key one
+                       AssertExtensions.Throws<Exception> (() => {
+                               var f = field.ForeignKeyColumn;
+                       }, "#C8");
+                       AssertExtensions.Throws<Exception> (() => {
+                               var f = field.GetForeignKeyPath ();
+                       }, "#C9");
+                       Assert.IsNotNull (field.Host, "#C10");
+                       Assert.AreEqual (dc, field.Host, "#C10-1");
+                       Assert.IsNotNull (field.MetadataAttributes, "#C11");
+                       Assert.AreEqual (DataBoundControlMode.ReadOnly, field.Mode, "#C12");
+
+                       // Failure with the same exception as above
+                       //Assert.IsNull (field.Row, "#C13");
+
+                       Assert.IsNotNull (field.Table, "#C14");
+                       Assert.AreEqual (dc.Table, field.Table, "#C14-1");
+               }
+       }
+}
index d30417207f6ea55140d136e425010912b15db6a9..40f2e31ba5a24a9c890c48ffebbfbe51ae79a99b 100644 (file)
@@ -8,19 +8,22 @@
 
 <script RunAt="server">
 
-       void RegisterRoutes (RouteCollection routes)
-       {
-               var provider = new DynamicDataContainerModelProvider <EmployeesDataContext> ();
-               Utils.RegisterContext (provider, new ContextConfiguration () { ScaffoldAllTables = true }, true);
-               routes.Add (new DynamicDataRoute ("{table}/{action}.aspx") {
-                       Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }),
-                       Model = MetaModel.Default
-               });
-       }
-       
-       void Application_Start (object sender, EventArgs e)
-       {
-               RegisterRoutes (RouteTable.Routes);
-       }
+    void RegisterRoutes (RouteCollection routes) {
+        var provider = new DynamicDataContainerModelProvider<EmployeesDataContext> ();
+        provider.ResolveAssociations ();
+        Utils.RegisterContext (provider, new ContextConfiguration () { ScaffoldAllTables = true }, true);
+        
+        var provider2 = new DynamicDataContainerModelProvider<TestDataContext3> ();
+        provider2.ResolveAssociations ();
+        Utils.RegisterContext (provider2, new ContextConfiguration () { ScaffoldAllTables = true }, true);
+        routes.Add (new DynamicDataRoute ("{table}/{action}.aspx") {
+            Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }),
+            Model = MetaModel.Default
+        });
+    }
+
+    void Application_Start (object sender, EventArgs e) {
+        RegisterRoutes (RouteTable.Routes);
+    }
 </script>
 
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_09.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_09.aspx
new file mode 100644 (file)
index 0000000..c253ee7
--- /dev/null
@@ -0,0 +1,29 @@
+<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ListView_DynamicControl_09.aspx.cs" Inherits="ListView_DynamicControl_09" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html >
+<head id="Head1" runat="server">
+  <title>DynamicControl Sample</title>
+</head>
+<body>
+    <form id="form1" runat="server">
+    <div>
+      <asp:DynamicDataManager ID="DynamicDataManager1" runat="server" AutoLoadForeignKeys="true" />
+      <asp:ListView ID="ListView1" runat="server" DataSourceID="DynamicDataSource1">
+        <LayoutTemplate>
+          <div runat="server" id="itemPlaceholder" />
+        </LayoutTemplate>
+        <ItemTemplate>
+       <div>
+               <test:PokerDynamicControl runat="server" DataField="PrimaryKeyColumn1" id="PrimaryKeyColumn1"/> 
+               <test:PokerDynamicControl runat="server" DataField="PrimaryKeyColumn2" id="PrimaryKeyColumn2"/>
+               <test:PokerDynamicControl runat="server" DataField="Column1" ID="Column1" CssClass="activeCssClass" />
+        </div>
+        </ItemTemplate>
+      </asp:ListView>
+
+       <test:DynamicDataSource runat="server" id="DynamicDataSource1" />
+    </div>
+    </form>
+</body>
+</html>
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_09.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_09.aspx.cs
new file mode 100644 (file)
index 0000000..47a170d
--- /dev/null
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+using MonoTests.DataObjects;
+using MonoTests.Common;
+using MonoTests.SystemWeb.Framework;
+using MonoTests.DataSource;
+
+public partial class ListView_DynamicControl_09 : TestsBasePage <TestDataContext3>
+{
+       protected override void PopulateDataSource (DynamicDataSource ds)
+       {
+               var container = ds.DataContainerInstance as TestDataContainer<TestDataContext3>;
+               if (container == null)
+                       return;
+
+               List<AssociatedFoo> foo = container.ContainedTypeInstance.AssociatedFoo;
+               foo.Add (new AssociatedFoo {
+                       PrimaryKeyColumn1 = "Marek",
+                       PrimaryKeyColumn2 = 2,
+                       Column1 = 1
+               });
+       }
+
+       protected void Page_Init (object sender, EventArgs e)
+       {
+               InitializeDataSource (DynamicDataSource1, "AssociatedFooTable");
+               DynamicDataManager1.RegisterControl (ListView1);
+       }
+
+       protected void Page_Load (object sender, EventArgs e)
+       {
+
+       }
+}
index 2d60e1241ff84b93b8814e97fbea32f6ce951806..419401cb29df72d79f46ee6ead15628d9866cecc 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-15  Marek Habersack  <mhabersack@novell.com>
+
+       * ListView.cs: CreateChildControls calls EnsureDataBound only if
+       we're not in post-back and if data binding is required.
+
 2009-09-08  Marek Habersack  <mhabersack@novell.com>
 
        * ListView.cs: if total row count has been retrieved from the
index af08e380090911d7006c16c514583619c6b9485a..6bd6f0cda387d99a7e1403bfa9f6d53b5c0e7480 100644 (file)
@@ -768,9 +768,6 @@ namespace System.Web.UI.WebControls
                {
                        object itemCount = ViewState ["_!ItemCount"];
                        if (itemCount != null) {
-                               if (RequiresDataBinding)
-                                       EnsureDataBound ();
-
                                int c = (int)itemCount;
                                if (c >= 0) {
                                        // Fake data - we only need to make sure
@@ -779,7 +776,8 @@ namespace System.Web.UI.WebControls
                                        object[] data = new object [c];
                                        CreateChildControls (data, false);
                                }
-                       }
+                       } else if (RequiresDataBinding)
+                               EnsureDataBound ();
                        
                        base.CreateChildControls ();
                }