RazorEngineHost CreateRazorHost(string fileName)
        {
            var projectFile = project.GetProjectFile(fileName);

            if (projectFile != null && projectFile.Generator == "RazorTemplatePreprocessor")
            {
                var h = MonoDevelop.RazorGenerator.RazorTemplatePreprocessor.CreateHost(fileName);
                h.DesignTimeMode = true;
                return(h);
            }

            string virtualPath = "~/Views/Default.cshtml";

            if (aspProject != null)
            {
                virtualPath = aspProject.LocalToVirtualPath(fileName);
            }

            WebPageRazorHost host = null;

            // Try to create host using web.config file
            var webConfigMap = new WebConfigurationFileMap();

            if (aspProject != null)
            {
                var vdm = new VirtualDirectoryMapping(aspProject.BaseDirectory.Combine("Views"), true, "web.config");
                webConfigMap.VirtualDirectories.Add("/", vdm);
            }
            Configuration configuration;

            try {
                configuration = WebConfigurationManager.OpenMappedWebConfiguration(webConfigMap, "/");
            } catch {
                configuration = null;
            }
            if (configuration != null)
            {
                var rws = configuration.GetSectionGroup(RazorWebSectionGroup.GroupName) as RazorWebSectionGroup;
                if (rws != null)
                {
                    host = WebRazorHostFactory.CreateHostFromConfig(rws, virtualPath, fileName);
                    host.DesignTimeMode = true;
                }
            }

            if (host == null)
            {
                host = new MvcWebPageRazorHost(virtualPath, fileName)
                {
                    DesignTimeMode = true
                };
                // Add default namespaces from Razor section
                host.NamespaceImports.Add("System.Web.Mvc");
                host.NamespaceImports.Add("System.Web.Mvc.Ajax");
                host.NamespaceImports.Add("System.Web.Mvc.Html");
                host.NamespaceImports.Add("System.Web.Routing");
            }

            return(host);
        }
        public void Constructor() {
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");

            Assert.AreEqual("foo.cshtml", host.VirtualPath);
            Assert.AreEqual("bar", host.PhysicalPath);
            Assert.AreEqual(typeof(WebViewPage).FullName, host.DefaultBaseClass);
        }
Beispiel #3
0
        public void Constructor()
        {
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");

            Assert.Equal("foo.cshtml", host.VirtualPath);
            Assert.Equal("bar", host.PhysicalPath);
            Assert.Equal(typeof(WebViewPage).FullName, host.DefaultBaseClass);
        }
Beispiel #4
0
        public void DecorateCodeParser_ThrowsOnNull()
        {
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");

            ExceptionHelper.ExpectArgumentNullException(delegate() {
                host.DecorateCodeParser(null);
            }, "incomingCodeParser");
        }
        public void DecorateCodeParser_ReplacesCSharpCodeParserWithMvcSpecificOne() {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");
            var parser = new CSharpCodeParser();

            // Act
            var result = host.DecorateCodeParser(parser);

            // Assert
            Assert.IsInstanceOfType(result, typeof(MvcCSharpRazorCodeParser));
        }
        public void ConstructorRemovesUnwantedNamespaceImports() {
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");

            Assert.IsFalse(host.NamespaceImports.Contains("System.Web.WebPages.Html"));

            // Even though MVC no longer needs to remove the following two namespaces
            // (because they are no longer imported by System.Web.WebPages), we want
            // to make sure that they don't get introduced again by default.
            Assert.IsFalse(host.NamespaceImports.Contains("WebMatrix.Data"));
            Assert.IsFalse(host.NamespaceImports.Contains("WebMatrix.WebData"));
        }
Beispiel #7
0
        public void ConstructorRemovesUnwantedNamespaceImports()
        {
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");

            Assert.False(host.NamespaceImports.Contains("System.Web.WebPages.Html"));

            // Even though MVC no longer needs to remove the following two namespaces
            // (because they are no longer imported by System.Web.WebPages), we want
            // to make sure that they don't get introduced again by default.
            Assert.False(host.NamespaceImports.Contains("WebMatrix.Data"));
            Assert.False(host.NamespaceImports.Contains("WebMatrix.WebData"));
        }
Beispiel #8
0
    private static RazorTemplateEngine SetupRazorEngine()
    {
        // Set up the hosting environment (filename here is only used to trick RazorTemplateEngine)
        var host = new MvcWebPageRazorHost("~/test.cshtml", System.Environment.CurrentDirectory);

        host.NamespaceImports.Add("System.Web.Mvc.Html");
        host.NamespaceImports.Add("Tychaia.Website");
        // TODO: add your namespaces here

        // Create the template engine using this host
        return(new RazorTemplateEngine(host));
    }
        public void DecorateCodeParser_ThrowsOnNull()
        {
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");

            Assert.ThrowsArgumentNull(
                delegate()
            {
                host.DecorateCodeParser(null);
            },
                "incomingCodeParser"
                );
        }
Beispiel #10
0
        public void DecorateCodeParser_ReplacesCSharpCodeParserWithMvcSpecificOne()
        {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");
            var parser = new CSharpCodeParser();

            // Act
            var result = host.DecorateCodeParser(parser);

            // Assert
            Assert.IsInstanceOfType(result, typeof(MvcCSharpRazorCodeParser));
        }
Beispiel #11
0
        public void DecorateCodeParser_ReplacesVBCodeParserWithMvcSpecificOne()
        {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.vbhtml", "bar");
            var parser = new VBCodeParser();

            // Act
            var result = host.DecorateCodeParser(parser);

            // Assert
            Assert.IsType <MvcVBRazorCodeParser>(result);
        }
        public void DecorateGodeGenerator_ReplacesVBCodeGeneratorWithMvcSpecificOne() {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.vbhtml", "bar");
            var generator = new VBRazorCodeGenerator("someClass", "root.name", "foo.vbhtml", host);

            // Act
            var result = host.DecorateCodeGenerator(generator);

            // Assert
            Assert.IsInstanceOfType(result, typeof(MvcVBRazorCodeGenerator));
            Assert.AreEqual("someClass", result.ClassName);
            Assert.AreEqual("root.name", result.RootNamespaceName);
            Assert.AreEqual("foo.vbhtml", result.SourceFileName);
            Assert.AreSame(host, result.Host);
        }
        public void DecorateGodeGenerator_ReplacesCSharpCodeGeneratorWithMvcSpecificOne()
        {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");
            var generator = new CSharpRazorCodeGenerator("someClass", "root.name", "foo.cshtml", host);

            // Act
            var result = host.DecorateCodeGenerator(generator);

            // Assert
            Assert.IsType<MvcCSharpRazorCodeGenerator>(result);
            Assert.Equal("someClass", result.ClassName);
            Assert.Equal("root.name", result.RootNamespaceName);
            Assert.Equal("foo.cshtml", result.SourceFileName);
            Assert.Same(host, result.Host);
        }
Beispiel #14
0
        public void DecorateGodeGenerator_ReplacesVBCodeGeneratorWithMvcSpecificOne()
        {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.vbhtml", "bar");
            var generator            = new VBRazorCodeGenerator("someClass", "root.name", "foo.vbhtml", host);

            // Act
            var result = host.DecorateCodeGenerator(generator);

            // Assert
            Assert.IsInstanceOfType(result, typeof(MvcVBRazorCodeGenerator));
            Assert.AreEqual("someClass", result.ClassName);
            Assert.AreEqual("root.name", result.RootNamespaceName);
            Assert.AreEqual("foo.vbhtml", result.SourceFileName);
            Assert.AreSame(host, result.Host);
        }
Beispiel #15
0
        public void DecorateGodeGenerator_ReplacesCSharpCodeGeneratorWithMvcSpecificOne()
        {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");
            var generator            = new CSharpRazorCodeGenerator("someClass", "root.name", "foo.cshtml", host);

            // Act
            var result = host.DecorateCodeGenerator(generator);

            // Assert
            Assert.IsType <MvcCSharpRazorCodeGenerator>(result);
            Assert.Equal("someClass", result.ClassName);
            Assert.Equal("root.name", result.RootNamespaceName);
            Assert.Equal("foo.cshtml", result.SourceFileName);
            Assert.Same(host, result.Host);
        }
Beispiel #16
0
        private CodeCompileUnit GetGeneratedCode(string virtualPath, TextReader reader)
        {
            var host = new MvcWebPageRazorHost(virtualPath, string.Empty)
            {
                DefaultBaseClass = typeof(WebViewPageSimulator).FullName
            };

            foreach (var ns in _namespaces)
            {
                host.NamespaceImports.Add(ns);
            }

            var generatedCode =
                new RazorTemplateEngine(host).GenerateCode(reader).GeneratedCode;

            return(generatedCode);
        }
Beispiel #17
0
        public static string GenerateCodeWithAspNetRazorViewEngine(string razorTemplatePath)
        {
            //-- Configure the code-generator
            var host = new MvcWebPageRazorHost("/", razorTemplatePath);

            //-- Parse the template into a CodeDOM graph (see http://msdn.microsoft.com/en-us/library/y2k85ax6(v=vs.110).aspx for an overview of what CodeDOM is)
            var engine = new RazorTemplateEngine(host);
            GeneratorResults results;

            using (var reader = new StringReader(File.ReadAllText(razorTemplatePath)))
            {
                results = engine.GenerateCode(reader);
            }

            //-- Generate C# code from the CodeDOM graph
            var builder = new StringBuilder();

            using (var writer = new StringWriter(builder, CultureInfo.InvariantCulture))
            {
                new CSharpCodeProvider().GenerateCodeFromCompileUnit(results.GeneratedCode, writer, new CodeGeneratorOptions());
                return(builder.ToString());
            }
        }
Beispiel #18
0
        /// <summary>
        /// Gets the code compile unit used to compile a type.
        /// </summary>
        /// <param name="className">The class name.</param>
        /// <param name="template">The template to compile.</param>
        /// <param name="namespaceImports">The set of namespace imports.</param>
        /// <param name="templateType">The template type.</param>
        /// <param name="modelType">The model type.</param>
        /// <returns>A <see cref="CodeCompileUnit"/> used to compile a type.</returns>
        public CodeCompileUnit GetCodeCompileUnit(string className, string template, ISet <string> namespaceImports, Type templateType, Type modelType)
        {
            if (string.IsNullOrEmpty(className))
            {
                throw new ArgumentException("Class name is required.");
            }

            if (string.IsNullOrEmpty(template))
            {
                throw new ArgumentException("Template is required.");
            }

            templateType = templateType
                           ?? ((modelType == null)
                        ? typeof(TemplateBase)
                        : typeof(TemplateBase <>));

            var host = new MvcWebPageRazorHost(CodeLanguage, () => MarkupParser)
            {
                DefaultBaseClass      = BuildTypeName(templateType, modelType),
                DefaultClassName      = className,
                DefaultNamespace      = "CompiledRazorTemplates.Dynamic",
                GeneratedClassContext = new GeneratedClassContext(
                    "Execute", "Write", "WriteLiteral",
                    "WriteTo", "WriteLiteralTo",
                    "ServiceStack.Razor.Templating.TemplateWriter",
                    "WriteSection")
            };

            var templateNamespaces = templateType.GetCustomAttributes(typeof(RequireNamespacesAttribute), true)
                                     .Cast <RequireNamespacesAttribute>()
                                     .SelectMany(att => att.Namespaces);

            foreach (string ns in templateNamespaces)
            {
                namespaceImports.Add(ns);
            }

            foreach (string @namespace in namespaceImports)
            {
                host.NamespaceImports.Add(@namespace);
            }

            var engine = new RazorTemplateEngine(host);
            GeneratorResults result;

            using (var reader = new StringReader(template))
            {
                result = engine.GenerateCode(reader);
            }

            var type = result.GeneratedCode.Namespaces[0].Types[0];

            if (modelType != null)
            {
                if (CompilerServices.IsAnonymousType(modelType))
                {
                    type.CustomAttributes.Add(new CodeAttributeDeclaration(
                                                  new CodeTypeReference(typeof(HasDynamicModelAttribute))));
                }
            }

            GenerateConstructors(CompilerServices.GetConstructors(templateType), type);

            var statement = new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "Clear");

            foreach (CodeTypeMember member in type.Members)
            {
                if (member.Name.Equals("Execute"))
                {
                    ((CodeMemberMethod)member).Statements.Insert(0, new CodeExpressionStatement(statement));
                    break;
                }
            }

            return(result.GeneratedCode);
        }
 public void DecorateCodeParser_ThrowsOnNull()
 {
     MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");
     Assert.ThrowsArgumentNull(delegate() { host.DecorateCodeParser(null); }, "incomingCodeParser");
 }
 public void DecorateCodeParser_ThrowsOnNull() {
     MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.cshtml", "bar");
     ExceptionHelper.ExpectArgumentNullException(delegate() {
         host.DecorateCodeParser(null);
     }, "incomingCodeParser");
 }
        public void DecorateCodeParser_ReplacesVBCodeParserWithMvcSpecificOne() {
            // Arrange
            MvcWebPageRazorHost host = new MvcWebPageRazorHost("foo.vbhtml", "bar");
            var parser = new VBCodeParser();

            // Act
            var result = host.DecorateCodeParser(parser);

            // Assert
            Assert.IsType<MvcVBRazorCodeParser>(result);
        }
Beispiel #22
0
        static RazorEngineHost CreateRazorHost(RazorCSharpParserContext context)
        {
            if (context.Project != null)
            {
                var projectFile = context.Project.GetProjectFile(context.FileName);
                if (projectFile != null && projectFile.Generator == "RazorTemplatePreprocessor")
                {
                    return(new MonoDevelop.AspNet.Razor.Generator.PreprocessedRazorHost(context.FileName)
                    {
                        DesignTimeMode = true,
                        EnableLinePragmas = false,
                    });
                }
            }

            string virtualPath = "~/Views/Default.cshtml";

            if (context.AspProject != null)
            {
                virtualPath = context.AspProject.LocalToVirtualPath(context.FileName);
            }

            WebPageRazorHost host = null;

            // Try to create host using web.config file
            var webConfigMap = new WebConfigurationFileMap();

            if (context.AspProject != null)
            {
                var vdm = new VirtualDirectoryMapping(context.AspProject.Project.BaseDirectory.Combine("Views"), true, "web.config");
                webConfigMap.VirtualDirectories.Add("/", vdm);
            }
            Configuration configuration;

            try {
                configuration = WebConfigurationManager.OpenMappedWebConfiguration(webConfigMap, "/");
            } catch {
                configuration = null;
            }
            if (configuration != null)
            {
                //TODO: use our assemblies, not the project's
                var rws = configuration.GetSectionGroup(RazorWebSectionGroup.GroupName) as RazorWebSectionGroup;
                if (rws != null)
                {
                    host = WebRazorHostFactory.CreateHostFromConfig(rws, virtualPath, context.FileName);
                    host.DesignTimeMode = true;
                }
            }

            if (host == null)
            {
                host = new MvcWebPageRazorHost(virtualPath, context.FileName)
                {
                    DesignTimeMode = true
                };
                // Add default namespaces from Razor section
                host.NamespaceImports.Add("System.Web.Mvc");
                host.NamespaceImports.Add("System.Web.Mvc.Ajax");
                host.NamespaceImports.Add("System.Web.Mvc.Html");
                host.NamespaceImports.Add("System.Web.Routing");
            }

            return(host);
        }