From e2058905ec30facdf41d1eca2360be3c4b6b7314 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 19 Mar 2015 15:30:25 -0700 Subject: [PATCH] TagHelpers attribute targeting - part 2 --- .../Properties/Resources.Designer.cs | 16 ---- .../Resources.resx | 3 - .../SelectTagHelper.cs | 91 ++++++++----------- .../TextAreaTagHelper.cs | 29 +++--- .../SelectTagHelperTest.cs | 31 ------- .../TextAreaTagHelperTest.cs | 61 ------------- 6 files changed, 51 insertions(+), 180 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/Properties/Resources.Designer.cs index 53da161a39..e167fc52c6 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/Properties/Resources.Designer.cs @@ -90,22 +90,6 @@ namespace Microsoft.AspNet.Mvc.TagHelpers return string.Format(CultureInfo.CurrentCulture, GetString("InputTagHelper_ValueRequired"), p0, p1, p2, p3); } - /// - /// Cannot determine body for {0}. '{2}' must be null if '{1}' is null. - /// - internal static string SelectTagHelper_CannotDetermineContentWhenOnlyItemsSpecified - { - get { return GetString("SelectTagHelper_CannotDetermineContentWhenOnlyItemsSpecified"); } - } - - /// - /// Cannot determine body for {0}. '{2}' must be null if '{1}' is null. - /// - internal static string FormatSelectTagHelper_CannotDetermineContentWhenOnlyItemsSpecified(object p0, object p1, object p2) - { - return string.Format(CultureInfo.CurrentCulture, GetString("SelectTagHelper_CannotDetermineContentWhenOnlyItemsSpecified"), p0, p1, p2); - } - /// /// The {2} was unable to provide metadata about '{1}' expression value '{3}' for {0}. /// diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/Resources.resx b/src/Microsoft.AspNet.Mvc.TagHelpers/Resources.resx index 6a35258fbb..1aa82d190f 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/Resources.resx +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/Resources.resx @@ -132,9 +132,6 @@ '{1}' must not be null for {0} if '{2}' is '{3}'. - - Cannot determine body for {0}. '{2}' must be null if '{1}' is null. - The {2} was unable to provide metadata about '{1}' expression value '{3}' for {0}. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs index 3b51d0aade..54b9e5077a 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/SelectTagHelper.cs @@ -14,6 +14,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers /// /// implementation targeting <select> elements with an asp-for attribute. /// + [TargetElement("select", Attributes = ForAttributeName)] public class SelectTagHelper : TagHelper { private const string ForAttributeName = "asp-for"; @@ -57,63 +58,47 @@ namespace Microsoft.AspNet.Mvc.TagHelpers /// public override void Process(TagHelperContext context, TagHelperOutput output) { - if (For == null) + // Note null or empty For.Name is allowed because TemplateInfo.HtmlFieldPrefix may be sufficient. + // IHtmlGenerator will enforce name requirements. + var metadata = For.Metadata; + if (metadata == null) { - // Regular HTML ", - ForAttributeName, - ItemsAttributeName); - throw new InvalidOperationException(message); - } + throw new InvalidOperationException(Resources.FormatTagHelpers_NoProvidedMetadata( + "", - ForAttributeName, - nameof(IModelMetadataProvider), - For.Name)); - } - - // Base allowMultiple on the instance or declared type of the expression to avoid a - // "SelectExpressionNotEnumerable" InvalidOperationException during generation. - // Metadata.IsCollectionType() is similar but does not take runtime type into account. - var realModelType = For.ModelExplorer.ModelType; - var allowMultiple = - typeof(string) != realModelType && typeof(IEnumerable).IsAssignableFrom(realModelType); - - // Ensure GenerateSelect() _never_ looks anything up in ViewData. - var items = Items ?? Enumerable.Empty(); - - ICollection selectedValues; - var tagBuilder = Generator.GenerateSelect( - ViewContext, - For.ModelExplorer, - optionLabel: null, - expression: For.Name, - selectList: items, - allowMultiple: allowMultiple, - htmlAttributes: null, - selectedValues: out selectedValues); - - if (tagBuilder != null) - { - output.MergeAttributes(tagBuilder); - output.PostContent.Append(tagBuilder.InnerHtml); - } - - // Whether or not (not being highly unlikely) we generate anything, could update contained