66using System . Globalization ;
77using System . Linq ;
88using System . Reflection ;
9- using System . Threading . Tasks ;
109using Microsoft . AspNetCore . Razor . Compilation . TagHelpers ;
1110using Microsoft . AspNetCore . Razor . Runtime . TagHelpers ;
1211using Microsoft . AspNetCore . Razor . TagHelpers ;
@@ -20,6 +19,7 @@ public class AssemblyTagHelperDescriptorResolver
2019 private const string MvcAssemblyName = "Microsoft.AspNetCore.Mvc" ;
2120 private const string MethodName = "PopulateServiceCollection" ;
2221 private const string ViewComponentNameKey = "ViewComponentName" ;
22+ private const string PropertyBagPropertyName = "PropertyBag" ;
2323
2424 private readonly TagHelperDescriptorFactory _tagHelperDescriptorFactory ;
2525 private readonly TagHelperTypeResolver _tagHelperTypeResolver ;
@@ -92,7 +92,7 @@ public IEnumerable<TagHelperDescriptor> Resolve(string assemblyName, ErrorSink e
9292
9393 // Temporary workaround to make design time for ViewComponent tag helpers work without needing a VS update.
9494 // This will be removed in a future version.
95- var vcthDescriptors = descriptors . Where ( d => d . PropertyBag . ContainsKey ( ViewComponentNameKey ) ) ;
95+ var vcthDescriptors = descriptors . Where ( d => IsViewComponentTagHelperDescriptor ( d ) ) ;
9696 var fakeVcthDescriptors = GetFakeDescriptors ( vcthDescriptors ) ;
9797
9898 var finalDescriptors = descriptors . Except ( vcthDescriptors ) . Union ( fakeVcthDescriptors ) ;
@@ -141,15 +141,13 @@ private IEnumerable<TagHelperDescriptor> GetFakeDescriptors(IEnumerable<TagHelpe
141141 foreach ( var descriptor in vcthDescriptors )
142142 {
143143 var fakeType = typeof ( ViewComponentTagHelperDesignTimeType ) . FullName ;
144- var fakeDescriptor = new TagHelperDescriptor ( descriptor ) ;
145- fakeDescriptor . TypeName = fakeType ;
144+ var fakeDescriptor = GetFakeDescriptorForTypeName ( descriptor , fakeType ) ;
146145
147146 var fakeAttributes = new List < TagHelperAttributeDescriptor > ( ) ;
148147 fakeDescriptor . Attributes = fakeAttributes ;
149148
150149 var fakeHelperType = typeof ( ViewComponentTagHelperDesignTimeHelperType ) . FullName ;
151- var fakeHelperDescriptor = new TagHelperDescriptor ( descriptor ) ;
152- fakeHelperDescriptor . TypeName = fakeHelperType ;
150+ var fakeHelperDescriptor = GetFakeDescriptorForTypeName ( descriptor , fakeHelperType ) ;
153151
154152 var fakeHelperAttributes = new List < TagHelperAttributeDescriptor > ( ) ;
155153 fakeHelperDescriptor . Attributes = fakeHelperAttributes ;
@@ -216,6 +214,38 @@ private IEnumerable<TagHelperDescriptor> GetFakeDescriptors(IEnumerable<TagHelpe
216214
217215 return fakeDescriptors ;
218216 }
217+
218+ private static TagHelperDescriptor GetFakeDescriptorForTypeName ( TagHelperDescriptor descriptor , string typeName )
219+ {
220+ var fakeDescriptor = new TagHelperDescriptor ( )
221+ {
222+ Prefix = descriptor . Prefix ,
223+ TagName = descriptor . TagName ,
224+ TypeName = typeName ,
225+ AssemblyName = descriptor . AssemblyName ,
226+ Attributes = descriptor . Attributes ,
227+ RequiredAttributes = descriptor . RequiredAttributes ,
228+ AllowedChildren = descriptor . AllowedChildren ,
229+ RequiredParent = descriptor . RequiredParent ,
230+ TagStructure = descriptor . TagStructure ,
231+ DesignTimeDescriptor = descriptor . DesignTimeDescriptor
232+ } ;
233+
234+ return fakeDescriptor ;
235+ }
236+
237+ private static bool IsViewComponentTagHelperDescriptor ( TagHelperDescriptor descriptor )
238+ {
239+ var propertyBag = descriptor . GetType ( ) . GetProperty ( PropertyBagPropertyName ) ? . GetValue ( descriptor )
240+ as IDictionary < string , string > ;
241+
242+ if ( propertyBag != null )
243+ {
244+ return propertyBag . ContainsKey ( ViewComponentNameKey ) ;
245+ }
246+
247+ return false ;
248+ }
219249 }
220250
221251 public abstract class ViewComponentTagHelperDesignTimeType : TagHelper
0 commit comments