Beispiel #1
0
        protected override string RenderTemplate(string content, PageContext pageData)
        {
            var serviceConfiguration = new TemplateServiceConfiguration
            {
                TemplateManager          = new IncludesResolver(FileSystem, includesPath),
                BaseTemplateType         = typeof(ExtensibleTemplate <>),
                DisableTempFileLocking   = true,
                CachingProvider          = new DefaultCachingProvider(t => { }),
                ConfigureCompilerBuilder = builder => ModelDirective.Register(builder)
            };

            serviceConfiguration.Activator = new ExtensibleActivator(serviceConfiguration.Activator, Filters, _allTags);

            Engine.Razor = RazorEngineService.Create(serviceConfiguration);

            content = Regex.Replace(content, "<p>(@model .*?)</p>", "$1");

            var pageContent = pageData.Content;

            pageData.Content = pageData.FullContent;

            try
            {
                content          = Engine.Razor.RunCompile(content, pageData.Page.File, typeof(PageContext), pageData);
                pageData.Content = pageContent;
                return(content);
            }
            catch (Exception e)
            {
                Tracing.Error(@"Failed to render template, falling back to direct content");
                Tracing.Debug(e.Message);
                Tracing.Debug(e.StackTrace);
                return(content);
            }
        }
        protected override void ExecuteCore(RazorCodeDocument codeDocument)
        {
            DocumentIntermediateNode documentNode = codeDocument.GetDocumentIntermediateNode();

            NamespaceDeclarationIntermediateNode namespaceDeclaration =
                documentNode.Children.OfType <NamespaceDeclarationIntermediateNode>().Single();

            // Get the current model type, replacing default of dynamic with IDocument
            string modelType = ModelDirective.GetModelType(documentNode);

            modelType = modelType == "dynamic" ? "IDocument" : modelType;

            // Set the base page type and perform default model type substitution here
            ClassDeclarationIntermediateNode classDeclaration =
                namespaceDeclaration.Children.OfType <ClassDeclarationIntermediateNode>().Single();

            classDeclaration.BaseType = _baseType.Replace("<TModel>", "<" + modelType + ">");

            // Add namespaces
            int insertIndex = namespaceDeclaration.Children.IndexOf(
                namespaceDeclaration.Children.OfType <UsingDirectiveIntermediateNode>().First());

            foreach (string ns in _namespaces)
            {
                namespaceDeclaration.Children.Insert(
                    insertIndex,
                    new UsingDirectiveIntermediateNode()
                {
                    Content = ns
                });
            }

            codeDocument.SetDocumentIntermediateNode(documentNode);
        }
        private IList <ModelDirective> BuildDirectivesFromAttributes(ICustomAttributeProvider clrObjectInfo,
                                                                     DirectiveLocation location, GraphQLModelObject owner)
        {
            var attrList = clrObjectInfo.GetCustomAttributes(inherit: true);

            if (attrList.Length == 0)
            {
                return(ModelDirective.EmptyList);
            }

            var dirList = new List <ModelDirective>();

            foreach (var attr in attrList)
            {
                if (!(attr is BaseDirectiveAttribute dirAttr))
                {
                    continue;
                }
                var dirAttrType = dirAttr.GetType();
                var dirDef      = _model.Directives.Values.FirstOrDefault(def => def.DirInfo.AttributeType == dirAttrType);
                if (dirDef == null)
                {
                    AddError($"{clrObjectInfo}: directive attribute {dirAttrType} not registered.");
                    continue;
                }
                var dir = new ModelDirective()
                {
                    Def = dirDef, ModelAttribute = dirAttr, Location = location
                };
                dirList.Add(dir);
            }
            return(dirList);
        } //method
Beispiel #4
0
        private RazorEngine GetRazorEngine()
        {
            var razorEngine = RazorEngine.Create(builder =>
            {
                InjectDirective.Register(builder);
                ModelDirective.Register(builder);
                NamespaceDirective.Register(builder);
                PageDirective.Register(builder);
                FunctionsDirective.Register(builder);
                InheritsDirective.Register(builder);
                SectionDirective.Register(builder);

                ////builder.AddTargetExtension(new TemplateTargetExtension()
                ////{
                ////    TemplateTypeName = "global::Microsoft.AspNetCore.Mvc.Razor.HelperResult",
                ////});

                ////builder.Features.Add(new SuppressChecksumOptionsFeature());
                builder.Features.Add(new ModelExpressionPass());
                builder.Features.Add(new PagesPropertyInjectionPass());
                builder.Features.Add(new ViewComponentTagHelperPass());
                builder.Features.Add(new RazorPageDocumentClassifierPass());
                builder.Features.Add(new MvcViewDocumentClassifierPass2(RuntimeTemplatesNamespace, BaseViewName));
                builder.Features.Add(new AssemblyAttributeInjectionPass2());

                if (!builder.DesignTime)
                {
                    //builder.Features.Add(new InstrumentationPass());
                }
            });

            return(razorEngine);
        }
Beispiel #5
0
    public static void Register(IRazorEngineBuilder builder)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        EnsureDesignTime(builder);

        InjectDirective.Register(builder);
        ModelDirective.Register(builder);

        FunctionsDirective.Register(builder);
        InheritsDirective.Register(builder);

        builder.Features.Add(new DefaultTagHelperDescriptorProvider());

        // Register section directive with the 1.x compatible target extension.
        builder.AddDirective(SectionDirective.Directive);
        builder.Features.Add(new SectionDirectivePass());
        builder.AddTargetExtension(new LegacySectionTargetExtension());

        builder.AddTargetExtension(new TemplateTargetExtension()
        {
            TemplateTypeName = "global::Microsoft.AspNetCore.Mvc.Razor.HelperResult",
        });

        builder.Features.Add(new ModelExpressionPass());
        builder.Features.Add(new MvcViewDocumentClassifierPass());
    }
Beispiel #6
0
    public static void Register(RazorProjectEngineBuilder builder)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        InjectDirective.Register(builder);
        ModelDirective.Register(builder);

        InheritsDirective.Register(builder);

        builder.Features.Add(new DefaultTagHelperDescriptorProvider());

        // Register section directive with the 1.x compatible target extension.
        builder.AddDirective(SectionDirective.Directive);
        builder.Features.Add(new SectionDirectivePass());
        builder.AddTargetExtension(new LegacySectionTargetExtension());

        builder.AddTargetExtension(new TemplateTargetExtension()
        {
            TemplateTypeName = "global::Microsoft.AspNetCore.Mvc.Razor.HelperResult",
        });

        builder.Features.Add(new ModelExpressionPass());
        builder.Features.Add(new MvcViewDocumentClassifierPass());

        builder.Features.Add(new MvcImportProjectFeature());

        // The default C# language version for what this Razor configuration supports.
        builder.SetCSharpLanguageVersion(LanguageVersion.CSharp7_3);
    }
Beispiel #7
0
    protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode)
    {
        if (documentNode.DocumentKind != RazorPageDocumentClassifierPass.RazorPageDocumentKind)
        {
            return;
        }

        var modelType = ModelDirective.GetModelType(documentNode);
        var visitor   = new Visitor();

        visitor.Visit(documentNode);

        var @class = visitor.Class;

        var viewDataType = $"global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary<{modelType}>";
        var vddProperty  = new CSharpCodeIntermediateNode();

        vddProperty.Children.Add(new IntermediateToken()
        {
            Kind    = TokenKind.CSharp,
            Content = $"public {viewDataType} ViewData => ({viewDataType})PageContext?.ViewData;",
        });
        @class.Children.Add(vddProperty);

        var modelProperty = new CSharpCodeIntermediateNode();

        modelProperty.Children.Add(new IntermediateToken()
        {
            Kind    = TokenKind.CSharp,
            Content = $"public {modelType} Model => ViewData.Model;",
        });
        @class.Children.Add(modelProperty);
    }
Beispiel #8
0
 public RuntimeDirective(ModelDirective modelDir, int index)
 {
     Source          = modelDir;
     Index           = index;
     Def             = modelDir.Def;
     Location        = modelDir.Location;
     StaticArgValues = modelDir.ArgValues;
 }
Beispiel #9
0
    public void ModelDirective_GetModelType_DefaultsToDynamic()
    {
        // Arrange
        var codeDocument = CreateDocument(@" ");

        var engine = CreateRuntimeEngine();

        var irDocument = CreateIRDocument(engine, codeDocument);

        // Act
        var result = ModelDirective.GetModelType(irDocument);

        // Assert
        Assert.Equal("dynamic", result);
    }
        public async Task Handle_AddOneUsingToPageDirective()
        {
            // Arrange
            var documentPath = "c:/Test.cshtml";
            var documentUri  = new Uri(documentPath);
            var contents     = $"@page{Environment.NewLine}@model IndexModel";

            var projectItem = new TestRazorProjectItem("c:/Test.cshtml", "c:/Test.cshtml", "Test.cshtml")
            {
                Content = contents
            };
            var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, TestRazorProjectFileSystem.Empty, (builder) =>
            {
                PageDirective.Register(builder);
                ModelDirective.Register(builder);
            });
            var codeDocument = projectEngine.Process(projectItem);

            codeDocument.SetFileKind(FileKinds.Legacy);

            var resolver     = new AddUsingsCodeActionResolver(LegacyDispatcher, CreateDocumentResolver(documentPath, codeDocument));
            var actionParams = new AddUsingsCodeActionParams
            {
                Uri       = documentUri,
                Namespace = "System"
            };
            var data = JObject.FromObject(actionParams);

            // Act
            var workspaceEdit = await resolver.ResolveAsync(data, default);

            // Assert
            Assert.NotNull(workspaceEdit);
            Assert.NotNull(workspaceEdit.DocumentChanges);
            Assert.Single(workspaceEdit.DocumentChanges);

            var documentChanges = workspaceEdit.DocumentChanges.ToArray();
            var addUsingsChange = documentChanges[0];

            Assert.True(addUsingsChange.IsTextDocumentEdit);
            var firstEdit = Assert.Single(addUsingsChange.TextDocumentEdit.Edits);

            Assert.Equal(1, firstEdit.Range.Start.Line);
            Assert.Equal($"@using System{Environment.NewLine}", firstEdit.NewText);
        }
Beispiel #11
0
        protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode)
        {
            if (documentNode.DocumentKind != RazorPageDocumentClassifierPass.RazorPageDocumentKind &&
                documentNode.DocumentKind != MvcViewDocumentClassifierPass.MvcViewDocumentKind)
            {
                // Not a MVC file. Skip.
                return;
            }

            var visitor = new Visitor();

            visitor.Visit(documentNode);
            var modelType = ModelDirective.GetModelType(documentNode);

            var properties = new HashSet <string>(StringComparer.Ordinal);

            for (var i = visitor.Directives.Count - 1; i >= 0; i--)
            {
                var directive = visitor.Directives[i];
                var tokens    = directive.Tokens.ToArray();
                if (tokens.Length < 2)
                {
                    continue;
                }

                var typeName   = tokens[0].Content;
                var memberName = tokens[1].Content;

                if (!properties.Add(memberName))
                {
                    continue;
                }

                typeName = typeName.Replace("<TModel>", "<" + modelType + ">");

                var injectNode = new InjectIntermediateNode()
                {
                    TypeName   = typeName,
                    MemberName = memberName,
                };

                visitor.Class.Children.Add(injectNode);
            }
        }
Beispiel #12
0
    public void ModelDirective_GetModelType_GetsTypeFromFirstWellFormedDirective()
    {
        // Arrange
        var codeDocument = CreateDocument(@"
@model Type1
@model Type2
@model
");

        var engine = CreateRuntimeEngine();

        var irDocument = CreateIRDocument(engine, codeDocument);

        // Act
        var result = ModelDirective.GetModelType(irDocument);

        // Assert
        Assert.Equal("Type1", result);
    }
Beispiel #13
0
    public static void Register(RazorProjectEngineBuilder builder)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        InjectDirective.Register(builder);
        ModelDirective.Register(builder);
        PageDirective.Register(builder);

        SectionDirective.Register(builder);

        builder.Features.Add(new DefaultTagHelperDescriptorProvider());
        builder.Features.Add(new ViewComponentTagHelperDescriptorProvider());

        builder.AddTargetExtension(new ViewComponentTagHelperTargetExtension());
        builder.AddTargetExtension(new TemplateTargetExtension()
        {
            TemplateTypeName = "global::Microsoft.AspNetCore.Mvc.Razor.HelperResult",
        });

        builder.Features.Add(new ModelExpressionPass());
        builder.Features.Add(new PagesPropertyInjectionPass());
        builder.Features.Add(new ViewComponentTagHelperPass());

        builder.Features.Add(new RazorPageDocumentClassifierPass(builder.Configuration.UseConsolidatedMvcViews));
        builder.Features.Add(new MvcViewDocumentClassifierPass(builder.Configuration.UseConsolidatedMvcViews));

        builder.Features.Add(new MvcImportProjectFeature());

        // The default C# language version for what this Razor configuration supports.
        builder.SetCSharpLanguageVersion(LanguageVersion.CSharp8);

        if (builder.Configuration.LanguageVersion.CompareTo(RazorLanguageVersion.Version_6_0) >= 0)
        {
            builder.Features.Add(new CreateNewOnMetadataUpdateAttributePass());
        }
    }
Beispiel #14
0
    public static void Register(RazorProjectEngineBuilder builder)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        FunctionsDirective.Register(builder);
        InjectDirective.Register(builder);
        ModelDirective.Register(builder);
        NamespaceDirective.Register(builder);
        PageDirective.Register(builder);

        InheritsDirective.Register(builder);
        SectionDirective.Register(builder);

        builder.Features.Add(new DefaultTagHelperDescriptorProvider());
        builder.Features.Add(new ViewComponentTagHelperDescriptorProvider());

        builder.AddTargetExtension(new ViewComponentTagHelperTargetExtension());
        builder.AddTargetExtension(new TemplateTargetExtension()
        {
            TemplateTypeName = "global::Microsoft.AspNetCore.Mvc.Razor.HelperResult",
        });

        builder.Features.Add(new ModelExpressionPass());
        builder.Features.Add(new PagesPropertyInjectionPass());
        builder.Features.Add(new ViewComponentTagHelperPass());
        builder.Features.Add(new RazorPageDocumentClassifierPass());
        builder.Features.Add(new MvcViewDocumentClassifierPass());
        builder.Features.Add(new AssemblyAttributeInjectionPass());
        builder.Features.Add(new InstrumentationPass());

        builder.Features.Add(new MvcImportProjectFeature());

        // The default C# language version for what this Razor configuration supports.
        builder.SetCSharpLanguageVersion(LanguageVersion.CSharp7_3);
    }
Beispiel #15
0
 public RuntimeModelDirective(ModelDirective modelDir) : base(modelDir.Def, modelDir.Location)
 {
     Directive = modelDir;
 }
Beispiel #16
0
        public async Task <ViewValidationException> ValidateAsync(string viewPath)
        {
            var fileSystem = RazorProjectFileSystem.Create(".");

            var engine = RazorProjectEngine.Create(
                RazorConfiguration.Default,
                fileSystem,
                (builder) =>
            {
                InheritsDirective.Register(builder);
                ModelDirective.Register(builder);
            });

            var item         = fileSystem.GetItem(viewPath);
            var codeDocument = engine.Process(item);

            var csharpDocument = codeDocument.GetCSharpDocument();
            var csharpTree     = CSharpSyntaxTree.ParseText(csharpDocument.GeneratedCode);

            var rootNode = await csharpTree.GetRootAsync();

            var memberAccesses = FetchChildrenRecursivelyFromNode(
                rootNode,
                SyntaxKind.SimpleMemberAccessExpression);

            foreach (var memberAccess in memberAccesses)
            {
                var simpleMemberAccess = memberAccess as MemberAccessExpressionSyntax;
                if (simpleMemberAccess == null)
                {
                    continue;
                }

                while (simpleMemberAccess.Expression is MemberAccessExpressionSyntax)
                {
                    simpleMemberAccess = (MemberAccessExpressionSyntax)simpleMemberAccess.Expression;
                }

                var identifier = simpleMemberAccess.Expression as IdentifierNameSyntax;
                if (identifier == null)
                {
                    continue;
                }

                var propertyName = identifier.Identifier.Text;
                if (propertyName != "Model")
                {
                    return(new ViewValidationException("The namespace " + propertyName + " is not allowed. You can only use Model when evaluating expressions."));
                }

                var methodName         = simpleMemberAccess.Name;
                var allowedMethodNames = new List <string>()
                {
                    nameof(ApiModel.Get),
                    nameof(ApiModel.GetCollection)
                };
                if (!allowedMethodNames.Contains(methodName.Identifier.Text))
                {
                    return(new ViewValidationException("The method " + methodName + " on the model object is not allowed. You can only call the following methods on that object: " + allowedMethodNames.Aggregate((a, b) => a + ", " + b) + "."));
                }
            }

            return(null);
        }