Ejemplo n.º 1
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);
    }
        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);
        }
Ejemplo n.º 3
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);
    }
Ejemplo n.º 4
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);
            }
        }
Ejemplo n.º 5
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);
    }