public static void Construct_Throws_ArgumentNullException_WhenGivenNullTemplateService()
        {
            // Arrange
            var htmlGenerator       = Mock.Of <IHtmlGenerator>(MockBehavior.Strict);
            var viewEngine          = Mock.Of <ICompositeViewEngine>(MockBehavior.Strict);
            var metadataProvider    = Mock.Of <IModelMetadataProvider>(MockBehavior.Strict);
            var bufferScope         = Mock.Of <IViewBufferScope>(MockBehavior.Strict);
            var htmlEncoder         = Mock.Of <HtmlEncoder>(MockBehavior.Strict);
            var urlEncoder          = Mock.Of <UrlEncoder>(MockBehavior.Strict);
            var expressionTextCache = new ExpressionTextCache();
            var paramName           = "templateService";

            // Act
            Action test = () => new TemplateHtmlHelper <object>(
                htmlGenerator,
                templateService: null,
                viewEngine,
                metadataProvider,
                bufferScope,
                htmlEncoder,
                urlEncoder,
                expressionTextCache);

            // Assert
            test.Should().Throw <ArgumentNullException>()
            .Which.ParamName.Should().Be(paramName);
        }
예제 #2
0
 public LayuiHtmlHelper(IHtmlGenerator htmlGenerator,
                        ICompositeViewEngine viewEngine,
                        IModelMetadataProvider metadataProvider,
                        IViewBufferScope bufferScope,
                        HtmlEncoder htmlEncoder,
                        UrlEncoder urlEncoder,
                        ExpressionTextCache expressionTextCache,
                        IOptions <LayuiOption> layuiOption) :
     base(htmlGenerator, viewEngine, metadataProvider, bufferScope, htmlEncoder, urlEncoder, expressionTextCache)
 {
     this._htmlGenerator = htmlGenerator;
     this._htmlEncoder   = htmlEncoder;
     this._layuiOption   = layuiOption.Value;
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="TemplateHtmlHelper{TModel}"/> class.
        /// </summary>
        /// <param name="htmlGenerator">The HTML generator.</param>
        /// <param name="templateService">The template service.</param>
        /// <param name="viewEngine">The view engine.</param>
        /// <param name="metadataProvider">The metadata provider.</param>
        /// <param name="bufferScope">The buffer scope.</param>
        /// <param name="htmlEncoder">The HTML encoder.</param>
        /// <param name="urlEncoder">The URL encoder.</param>
        /// <param name="expressionTextCache">The expression text cache.</param>
        /// <exception cref="ArgumentNullException"><paramref name="templateService"/></exception>
        public TemplateHtmlHelper(
            IHtmlGenerator htmlGenerator,
            ITemplateService templateService,
            ICompositeViewEngine viewEngine,
            IModelMetadataProvider metadataProvider,
            IViewBufferScope bufferScope,
            HtmlEncoder htmlEncoder,
            UrlEncoder urlEncoder,
            ExpressionTextCache expressionTextCache)
            : base(
                htmlGenerator,
                viewEngine,
                metadataProvider,
                bufferScope,
                htmlEncoder,
                urlEncoder,
                expressionTextCache)
        {
            Guard.NotNull(templateService, nameof(templateService));

            TemplateService = templateService;
        }
        private static HtmlHelper <TModel> GetHtmlHelper <TModel>(
            ViewDataDictionary <TModel> viewData,
            IUrlHelper urlHelper,
            ICompositeViewEngine viewEngine,
            IModelMetadataProvider provider,
            Func <IHtmlHelper, IHtmlHelper> innerHelperWrapper,
            IHtmlGenerator htmlGenerator,
            string idAttributeDotReplacement)
        {
            var httpContext   = new DefaultHttpContext();
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor(), viewData.ModelState);

            var options = new MvcViewOptions();

            if (!string.IsNullOrEmpty(idAttributeDotReplacement))
            {
                options.HtmlHelperOptions.IdAttributeDotReplacement = idAttributeDotReplacement;
            }
            var localizationOptionsAccesor = new Mock <IOptions <MvcDataAnnotationsLocalizationOptions> >();

            localizationOptionsAccesor.SetupGet(o => o.Value).Returns(new MvcDataAnnotationsLocalizationOptions());

            options.ClientModelValidatorProviders.Add(new DataAnnotationsClientModelValidatorProvider(
                                                          new ValidationAttributeAdapterProvider(),
                                                          localizationOptionsAccesor.Object,
                                                          stringLocalizerFactory: null));
            var optionsAccessor = new Mock <IOptions <MvcViewOptions> >();

            optionsAccessor
            .SetupGet(o => o.Value)
            .Returns(options);

            var valiatorProviders = new[]
            {
                new DataAnnotationsModelValidatorProvider(
                    new ValidationAttributeAdapterProvider(),
                    new TestOptionsManager <MvcDataAnnotationsLocalizationOptions>(),
                    stringLocalizerFactory: null),
            };

            var validator = new DefaultObjectValidator(provider, valiatorProviders);

            validator.Validate(actionContext, validationState: null, prefix: string.Empty, viewData.Model);

            var urlHelperFactory = new Mock <IUrlHelperFactory>();

            urlHelperFactory
            .Setup(f => f.GetUrlHelper(It.IsAny <ActionContext>()))
            .Returns(urlHelper);

            var expressionTextCache = new ExpressionTextCache();

            var attributeProvider = new DefaultValidationHtmlAttributeProvider(
                optionsAccessor.Object,
                provider,
                new ClientValidatorCache());

            if (htmlGenerator == null)
            {
                htmlGenerator = new DefaultHtmlGenerator(
                    Mock.Of <IAntiforgery>(),
                    optionsAccessor.Object,
                    provider,
                    urlHelperFactory.Object,
                    new HtmlTestEncoder(),
                    attributeProvider);
            }

            // TemplateRenderer will Contextualize this transient service.
            var innerHelper = (IHtmlHelper) new HtmlHelper(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default);

            if (innerHelperWrapper != null)
            {
                innerHelper = innerHelperWrapper(innerHelper);
            }

            var serviceCollection = new ServiceCollection();

            serviceCollection
            .AddSingleton(viewEngine)
            .AddSingleton(urlHelperFactory.Object)
            .AddSingleton(Mock.Of <IViewComponentHelper>())
            .AddSingleton(innerHelper)
            .AddSingleton <IViewBufferScope, TestViewBufferScope>()
            .AddSingleton <ValidationHtmlAttributeProvider>(attributeProvider)
            .AddHtmlTags(reg =>
            {
                reg.Editors.IfPropertyIs <DateTimeOffset>().ModifyWith(m =>
                                                                       m.CurrentTag.Attr("type", "datetime-local")
                                                                       .Value(GetDateValue(m.Value <DateTimeOffset?>())));
            });

            var serviceProvider = serviceCollection.BuildServiceProvider();

            httpContext.RequestServices = serviceProvider;

            var htmlHelper = new HtmlHelper <TModel>(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default,
                expressionTextCache);

            var viewContext = new ViewContext(
                actionContext,
                Mock.Of <IView>(),
                viewData,
                new TempDataDictionary(
                    httpContext,
                    Mock.Of <ITempDataProvider>()),
                new StringWriter(),
                options.HtmlHelperOptions)
            {
                ClientValidationEnabled = true
            };

            htmlHelper.Contextualize(viewContext);

            return(htmlHelper);
        }
예제 #5
0
        private static HtmlHelper <TModel> GetHtmlHelper <TModel>(
            ViewDataDictionary <TModel> viewData,
            IUrlHelper urlHelper,
            ICompositeViewEngine viewEngine,
            IModelMetadataProvider provider,
            Func <IHtmlHelper, IHtmlHelper> innerHelperWrapper,
            IHtmlGenerator htmlGenerator,
            string idAttributeDotReplacement)
        {
            var httpContext   = new DefaultHttpContext();
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

            var options = new MvcViewOptions();

            if (!string.IsNullOrEmpty(idAttributeDotReplacement))
            {
                options.HtmlHelperOptions.IdAttributeDotReplacement = idAttributeDotReplacement;
            }
            var localizationOptionsAccesor = new Mock <IOptions <MvcDataAnnotationsLocalizationOptions> >();

            localizationOptionsAccesor.SetupGet(o => o.Value).Returns(new MvcDataAnnotationsLocalizationOptions());

            options.ClientModelValidatorProviders.Add(new DataAnnotationsClientModelValidatorProvider(
                                                          new ValidationAttributeAdapterProvider(),
                                                          localizationOptionsAccesor.Object,
                                                          stringLocalizerFactory: null));
            var optionsAccessor = new Mock <IOptions <MvcViewOptions> >();

            optionsAccessor
            .SetupGet(o => o.Value)
            .Returns(options);

            var urlHelperFactory = new Mock <IUrlHelperFactory>();

            urlHelperFactory
            .Setup(f => f.GetUrlHelper(It.IsAny <ActionContext>()))
            .Returns(urlHelper);

            var expressionTextCache = new ExpressionTextCache();

            if (htmlGenerator == null)
            {
                var attributeProvider = new DefaultValidationHtmlAttributeProvider(
                    optionsAccessor.Object,
                    provider,
                    new ClientValidatorCache());
                htmlGenerator = new DefaultHtmlGenerator(
                    Mock.Of <IAntiforgery>(),
                    optionsAccessor.Object,
                    provider,
                    urlHelperFactory.Object,
                    new HtmlTestEncoder(),
                    attributeProvider);
            }

            // TemplateRenderer will Contextualize this transient service.
            var innerHelper = (IHtmlHelper) new HtmlHelper(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default);

            if (innerHelperWrapper != null)
            {
                innerHelper = innerHelperWrapper(innerHelper);
            }

            var serviceProvider = new ServiceCollection()
                                  .AddSingleton(viewEngine)
                                  .AddSingleton(urlHelperFactory.Object)
                                  .AddSingleton(Mock.Of <IViewComponentHelper>())
                                  .AddSingleton(innerHelper)
                                  .AddSingleton <IViewBufferScope, TestViewBufferScope>()
                                  .BuildServiceProvider();

            httpContext.RequestServices = serviceProvider;

            var htmlHelper = new HtmlHelper <TModel>(
                htmlGenerator,
                viewEngine,
                provider,
                new TestViewBufferScope(),
                new HtmlTestEncoder(),
                UrlEncoder.Default,
                expressionTextCache);

            var viewContext = new ViewContext(
                actionContext,
                Mock.Of <IView>(),
                viewData,
                new TempDataDictionary(
                    httpContext,
                    Mock.Of <ITempDataProvider>()),
                new StringWriter(),
                options.HtmlHelperOptions);

            htmlHelper.Contextualize(viewContext);

            return(htmlHelper);
        }
예제 #6
0
        public static string GetExpressionText(LambdaExpression expression, ExpressionTextCache expressionTextCache)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            string expressionText;
            if (expressionTextCache != null &&
                expressionTextCache.Entries.TryGetValue(expression, out expressionText))
            {
                return expressionText;
            }

            var containsIndexers = false;
            var part = expression.Body;

            // Builder to concatenate the names for property/field accessors within an expression to create a string.
            var builder = new StringBuilder();

            while (part != null)
            {
                if (part.NodeType == ExpressionType.Call)
                {
                    containsIndexers = true;
                    var methodExpression = (MethodCallExpression)part;
                    if (!IsSingleArgumentIndexer(methodExpression))
                    {
                        // Unsupported.
                        break;
                    }

                    InsertIndexerInvocationText(
                        builder,
                        methodExpression.Arguments.Single(),
                        expression);

                    part = methodExpression.Object;
                }
                else if (part.NodeType == ExpressionType.ArrayIndex)
                {
                    containsIndexers = true;
                    var binaryExpression = (BinaryExpression)part;

                    InsertIndexerInvocationText(
                        builder,
                        binaryExpression.Right,
                        expression);

                    part = binaryExpression.Left;
                }
                else if (part.NodeType == ExpressionType.MemberAccess)
                {
                    var memberExpressionPart = (MemberExpression)part;
                    var name = memberExpressionPart.Member.Name;

                    // If identifier contains "__", it is "reserved for use by the implementation" and likely compiler-
                    // or Razor-generated e.g. the name of a field in a delegate's generated class.
                    if (name.Contains("__"))
                    {
                        // Exit loop. Should have the entire name because previous MemberAccess has same name as the
                        // leftmost expression node (a variable).
                        break;
                    }

                    builder.Insert(0, name);
                    builder.Insert(0, '.');
                    part = memberExpressionPart.Expression;
                }
                else
                {
                    break;
                }
            }

            // If parts start with "model", then strip that part away.
            if (part == null || part.NodeType != ExpressionType.Parameter)
            {
                var text = builder.ToString();
                if (text.StartsWith(".model", StringComparison.OrdinalIgnoreCase))
                {
                    // 6 is the length of the string ".model".
                    builder.Remove(0, 6);
                }
            }

            if (builder.Length > 0)
            {
                // Trim the leading "." if present.
                builder.Replace(".", string.Empty, 0, 1);
            }

            expressionText = builder.ToString();

            if (expressionTextCache != null && !containsIndexers)
            {
                expressionTextCache.Entries.TryAdd(expression, expressionText);
            }

            return expressionText;
        }