[Mono-dev] MasterType directive on Master Pages

joel reed joel.reed at ddiworld.com
Fri Sep 15 14:04:44 EDT 2006


Ok, version 2 of the patch. Previously I was only compiling with 
PROFILE=net_2_0. Now it compiles for 1.1 and 2.0 profiles.

jr

joel reed wrote:
> Mono (as of 9/14/06 snapshots) doesn't currently support the MasterType 
> directive on Master Pages, although it does support it on regular pages. 
> MS supports it both places.
> 
> Please find attached a patch which implements support for this directive 
> for master pages as well. I've only submitted minor bug fixes to mono 
> before, so any feedback you can offer is appreciated.
> 
> I will add a testcase as needed. Which directory should I put it in?
> System.Web/Test/mainsoft?
> 
> jr
> 
> 
> ------------------------------------------------------------------------
> 
> diff --git a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs
> index 89c8adf..07cc5c8 100644
> --- a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs
> +++ b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs
> @@ -225,7 +225,7 @@ namespace System.Web.Compilation
>  				return new UserControlCompiler ((UserControlParser) tparser);
>  #if NET_2_0
>  			if (type == typeof(MasterPageParser))
> -				return new UserControlCompiler ((UserControlParser) tparser);
> +				return new MasterPageCompiler ((MasterPageParser) tparser);
>  #endif
>  
>  			throw new Exception ("Got type: " + type);
> diff --git a/mcs/class/System.Web/System.Web.Compilation/MasterPageCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/MasterPageCompiler.cs
> new file mode 100644
> index 0000000..02ad8c3
> --- /dev/null
> +++ b/mcs/class/System.Web/System.Web.Compilation/MasterPageCompiler.cs
> @@ -0,0 +1,64 @@
> +//
> +// System.Web.Compilation.MasterPageCompiler
> +//
> +// Authors:
> +//	Joel W. Reed (joelwreed at gmail.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.CodeDom;
> +using System.Web.UI;
> +
> +namespace System.Web.Compilation
> +{
> +	class MasterPageCompiler : UserControlCompiler
> +	{
> +		MasterPageParser parser;
> +
> +		public MasterPageCompiler (MasterPageParser parser)
> +			: base (parser)
> +		{
> +			this.parser = parser;
> +		}
> +
> +		protected internal override void CreateMethods ()
> +		{
> +			base.CreateMethods ();
> +
> +#if NET_2_0
> +			if (parser.MasterType != null) {
> +				CodeMemberProperty mprop = new CodeMemberProperty ();
> +				mprop.Name = "Master";
> +				mprop.Type = new CodeTypeReference (parser.MasterType);
> +				mprop.Attributes = MemberAttributes.Public | MemberAttributes.New;
> +				CodeExpression prop = new CodePropertyReferenceExpression (new CodeBaseReferenceExpression (), "Master");
> +				prop = new CodeCastExpression (parser.MasterType, prop);
> +				mprop.GetStatements.Add (new CodeMethodReturnStatement (prop));
> +				mainClass.Members.Add (mprop);
> +			}
> +#endif
> +		}
> +	}
> +}
> +
> diff --git a/mcs/class/System.Web/System.Web.UI/MasterPageParser.cs b/mcs/class/System.Web/System.Web.UI/MasterPageParser.cs
> index 1e6440f..b115473 100644
> --- a/mcs/class/System.Web/System.Web.UI/MasterPageParser.cs
> +++ b/mcs/class/System.Web/System.Web.UI/MasterPageParser.cs
> @@ -41,6 +41,8 @@ namespace System.Web.UI
>  {
>  	internal sealed class MasterPageParser: UserControlParser
>  	{
> +		Type masterType;
> +
>  		internal MasterPageParser (string virtualPath, string inputFile, HttpContext context)
>  		: base (virtualPath, inputFile, context, "System.Web.UI.MasterPage")
>  		{
> @@ -57,7 +59,6 @@ namespace System.Web.UI
>  			MasterPageParser mpp = new MasterPageParser (virtualPath, inputFile, context);
>  			return mpp.CompileIntoType ();
>  		}
> -
>  		internal override void HandleOptions (object obj)
>  		{
>  			base.HandleOptions (obj);
> @@ -66,6 +67,32 @@ namespace System.Web.UI
>  			mp.MasterPageFile = MasterPageFile;
>  		}
>  
> +#if NET_2_0
> +		internal override void AddDirective (string directive, Hashtable atts)
> +		{
> +			if (String.Compare ("MasterType", directive, true) == 0) {
> +				string type = GetString (atts, "TypeName", null);
> +				if (type != null) {
> +					masterType = LoadType (type);
> +					if (masterType == null)
> +						ThrowParseException ("Could not load type '" + type + "'.");
> +				} else {
> +					string path = GetString (atts, "VirtualPath", null);
> +					if (path != null)
> +						masterType = MasterPageParser.GetCompiledMasterType (path, MapPath (path), HttpContext.Current);
> +					else
> +						ThrowParseException ("The MasterType directive must have either a TypeName or a VirtualPath attribute.");				}
> +				AddAssembly (masterType.Assembly, true);
> +			}
> +			else
> +				base.AddDirective (directive, atts);
> +		}
> +#endif
> +
> +		internal Type MasterType {
> +			get { return masterType; }
> +		}
> +
>  		internal override Type DefaultBaseType {
>  			get { return typeof (MasterPage); }
>  		}
> diff --git a/mcs/class/System.Web/System.Web.dll.sources b/mcs/class/System.Web/System.Web.dll.sources
> index a68b69b..700dfaf 100644
> --- a/mcs/class/System.Web/System.Web.dll.sources
> +++ b/mcs/class/System.Web/System.Web.dll.sources
> @@ -51,6 +51,7 @@ System.Web.Compilation/ImplicitResourceK
>  System.Web.Compilation/IResourceProvider.cs
>  System.Web.Compilation/LinePragmaCodeInfo.cs
>  System.Web.Compilation/Location.cs
> +System.Web.Compilation/MasterPageCompiler.cs
>  System.Web.Compilation/PageBuildProvider.cs
>  System.Web.Compilation/PageCompiler.cs
>  System.Web.Compilation/PageThemeCompiler.cs
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: MasterType.on.MasterPages.v2.diff
Type: text/x-patch
Size: 5626 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20060915/f8f8c00a/attachment.bin 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: joel.reed.vcf
Type: text/x-vcard
Size: 405 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20060915/f8f8c00a/attachment.vcf 


More information about the Mono-devel-list mailing list