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); }
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); }
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); }
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; }