Skip to content

Commit f2540f9

Browse files
author
sornaks
committed
Making TagBuilder implement IHtmlContent and removing ToHtmlContent.
- Making TagRenderMode a property in TagBuilder. - Modifying places where TagBuilder is used to suit the new model. - This reduces space occupied by a normal application by 11.8%.
1 parent 93d0714 commit f2540f9

File tree

13 files changed

+150
-167
lines changed

13 files changed

+150
-167
lines changed

src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
163163
var antiforgeryTag = Generator.GenerateAntiforgery(ViewContext);
164164
if (antiforgeryTag != null)
165165
{
166-
output.PostContent.Append(antiforgeryTag.ToString());
166+
output.PostContent.Append(antiforgeryTag);
167167
}
168168
}
169169
}

src/Microsoft.AspNet.Mvc.TagHelpers/InputTagHelper.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,13 +236,13 @@ private void GenerateCheckBox(ModelExplorer modelExplorer, TagHelperOutput outpu
236236
}
237237
}
238238

239-
var tagBuilder = Generator.GenerateCheckBox(
239+
var checkBoxTag = Generator.GenerateCheckBox(
240240
ViewContext,
241241
modelExplorer,
242242
For.Name,
243243
isChecked: null,
244244
htmlAttributes: htmlAttributes);
245-
if (tagBuilder != null)
245+
if (checkBoxTag != null)
246246
{
247247
// Do not generate current element's attributes or tags. Instead put both <input type="checkbox"/> and
248248
// <input type="hidden"/> into the output's Content.
@@ -251,12 +251,14 @@ private void GenerateCheckBox(ModelExplorer modelExplorer, TagHelperOutput outpu
251251

252252
var renderingMode =
253253
output.TagMode == TagMode.SelfClosing ? TagRenderMode.SelfClosing : TagRenderMode.StartTag;
254-
output.Content.Append(tagBuilder.ToHtmlContent(renderingMode));
254+
checkBoxTag.TagRenderMode = renderingMode;
255+
output.Content.Append(checkBoxTag);
255256

256-
tagBuilder = Generator.GenerateHiddenForCheckbox(ViewContext, modelExplorer, For.Name);
257-
if (tagBuilder != null)
257+
var hiddenForCheckboxTag = Generator.GenerateHiddenForCheckbox(ViewContext, modelExplorer, For.Name);
258+
if (hiddenForCheckboxTag != null)
258259
{
259-
output.Content.Append(tagBuilder.ToHtmlContent(renderingMode));
260+
hiddenForCheckboxTag.TagRenderMode = renderingMode;
261+
output.Content.Append(hiddenForCheckboxTag);
260262
}
261263
}
262264
}

src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultDisplayTemplates.cs

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ private static IHtmlContent BooleanTemplateCheckbox(bool value, IHtmlHelper html
4141
inputTag.Attributes["checked"] = "checked";
4242
}
4343

44-
return inputTag.ToHtmlContent(TagRenderMode.SelfClosing);
44+
inputTag.TagRenderMode = TagRenderMode.SelfClosing;
45+
return inputTag;
4546
}
4647

4748
private static IHtmlContent BooleanTemplateDropDownList(IHtmlHelper htmlHelper, bool? value)
@@ -52,17 +53,13 @@ private static IHtmlContent BooleanTemplateDropDownList(IHtmlHelper htmlHelper,
5253
selectTag.Attributes["disabled"] = "disabled";
5354

5455
var content = new BufferedHtmlContent();
55-
content.Append(selectTag.ToHtmlContent(TagRenderMode.StartTag));
56-
5756
foreach (var item in TriStateValues(value))
5857
{
59-
content.Append(
60-
DefaultHtmlGenerator.GenerateOption(item, item.Text)
61-
.ToHtmlContent(TagRenderMode.Normal));
58+
content.Append(DefaultHtmlGenerator.GenerateOption(item, item.Text));
6259
}
6360

64-
content.Append(selectTag.ToHtmlContent(TagRenderMode.EndTag));
65-
return content;
61+
selectTag.InnerHtml = content;
62+
return selectTag;
6663
}
6764

6865
// Will soon need to be shared with the default editor templates implementations.
@@ -208,7 +205,6 @@ public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
208205
var viewData = htmlHelper.ViewData;
209206
var templateInfo = viewData.TemplateInfo;
210207
var modelExplorer = viewData.ModelExplorer;
211-
var content = new BufferedHtmlContent();
212208

213209
if (modelExplorer.Model == null)
214210
{
@@ -229,6 +225,7 @@ public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
229225
var serviceProvider = htmlHelper.ViewContext.HttpContext.RequestServices;
230226
var viewEngine = serviceProvider.GetRequiredService<ICompositeViewEngine>();
231227

228+
var content = new BufferedHtmlContent();
232229
foreach (var propertyExplorer in modelExplorer.Properties)
233230
{
234231
var propertyMetadata = propertyExplorer.Metadata;
@@ -237,25 +234,6 @@ public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
237234
continue;
238235
}
239236

240-
var divTag = new TagBuilder("div");
241-
242-
if (!propertyMetadata.HideSurroundingHtml)
243-
{
244-
var label = propertyMetadata.GetDisplayName();
245-
if (!string.IsNullOrEmpty(label))
246-
{
247-
divTag.SetInnerText(label);
248-
divTag.AddCssClass("display-label");
249-
content.AppendLine(divTag.ToHtmlContent(TagRenderMode.Normal));
250-
251-
// Reset divTag for reuse.
252-
divTag.Attributes.Clear();
253-
}
254-
255-
divTag.AddCssClass("display-field");
256-
content.Append(divTag.ToHtmlContent(TagRenderMode.StartTag));
257-
}
258-
259237
var templateBuilder = new TemplateBuilder(
260238
viewEngine,
261239
htmlHelper.ViewContext,
@@ -266,11 +244,26 @@ public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
266244
readOnly: true,
267245
additionalViewData: null);
268246

269-
content.Append(templateBuilder.Build());
270-
247+
var templateBuilderResult = templateBuilder.Build();
271248
if (!propertyMetadata.HideSurroundingHtml)
272249
{
273-
content.AppendLine(divTag.ToHtmlContent(TagRenderMode.EndTag));
250+
var label = propertyMetadata.GetDisplayName();
251+
if (!string.IsNullOrEmpty(label))
252+
{
253+
var labelTag = new TagBuilder("div");
254+
labelTag.SetInnerText(label);
255+
labelTag.AddCssClass("display-label");
256+
content.AppendLine(labelTag);
257+
}
258+
259+
var valueDivTag = new TagBuilder("div");
260+
valueDivTag.AddCssClass("display-field");
261+
valueDivTag.InnerHtml = templateBuilderResult;
262+
content.AppendLine(valueDivTag);
263+
}
264+
else
265+
{
266+
content.Append(templateBuilderResult);
274267
}
275268
}
276269

@@ -312,8 +305,7 @@ private static IHtmlContent HyperlinkTemplate(string uriString, string linkedTex
312305
var hyperlinkTag = new TagBuilder("a");
313306
hyperlinkTag.MergeAttribute("href", uriString);
314307
hyperlinkTag.SetInnerText(linkedText);
315-
316-
return hyperlinkTag.ToHtmlContent(TagRenderMode.Normal);
308+
return hyperlinkTag;
317309
}
318310
}
319311
}

src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultEditorTemplates.cs

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -256,28 +256,6 @@ public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
256256
continue;
257257
}
258258

259-
var divTag = new TagBuilder("div");
260-
261-
if (!propertyMetadata.HideSurroundingHtml)
262-
{
263-
var label = htmlHelper.Label(
264-
propertyMetadata.PropertyName,
265-
labelText: null,
266-
htmlAttributes: null);
267-
if (!string.IsNullOrEmpty(label.ToString()))
268-
{
269-
divTag.AddCssClass("editor-label");
270-
divTag.InnerHtml = label; // already escaped
271-
content.AppendLine(divTag.ToHtmlContent(TagRenderMode.Normal));
272-
273-
// Reset divTag for reuse.
274-
divTag.Attributes.Clear();
275-
}
276-
277-
divTag.AddCssClass("editor-field");
278-
content.Append(divTag.ToHtmlContent(TagRenderMode.StartTag));
279-
}
280-
281259
var templateBuilder = new TemplateBuilder(
282260
viewEngine,
283261
htmlHelper.ViewContext,
@@ -288,18 +266,36 @@ public static IHtmlContent ObjectTemplate(IHtmlHelper htmlHelper)
288266
readOnly: false,
289267
additionalViewData: null);
290268

291-
content.Append(templateBuilder.Build());
292-
269+
var templateBuilderResult = templateBuilder.Build();
293270
if (!propertyMetadata.HideSurroundingHtml)
294271
{
295-
content.Append(" ");
296-
content.Append(htmlHelper.ValidationMessage(
272+
var label = htmlHelper.Label(propertyMetadata.PropertyName, labelText: null, htmlAttributes: null);
273+
if (!string.IsNullOrEmpty(label.ToString()))
274+
{
275+
var labelTag = new TagBuilder("div");
276+
labelTag.AddCssClass("editor-label");
277+
labelTag.InnerHtml = label;
278+
content.AppendLine(labelTag);
279+
}
280+
281+
var valueDivTag = new TagBuilder("div");
282+
valueDivTag.AddCssClass("editor-field");
283+
284+
var innerContent = new BufferedHtmlContent();
285+
innerContent.Append(templateBuilderResult);
286+
innerContent.Append(" ");
287+
innerContent.Append(htmlHelper.ValidationMessage(
297288
propertyMetadata.PropertyName,
298289
message: null,
299290
htmlAttributes: null,
300291
tag: null));
292+
valueDivTag.InnerHtml = innerContent;
301293

302-
content.AppendLine(divTag.ToHtmlContent(TagRenderMode.EndTag));
294+
content.AppendLine(valueDivTag);
295+
}
296+
else
297+
{
298+
content.Append(templateBuilderResult);
303299
}
304300
}
305301

src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultHtmlGenerator.cs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ public virtual TagBuilder GenerateHiddenForCheckbox(
157157
var tagBuilder = new TagBuilder("input");
158158
tagBuilder.MergeAttribute("type", GetInputTypeString(InputType.Hidden));
159159
tagBuilder.MergeAttribute("value", "false");
160+
tagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
160161

161162
var fullName = GetFullHtmlFieldName(viewContext, expression);
162163
tagBuilder.MergeAttribute("name", fullName);
@@ -673,7 +674,7 @@ public virtual TagBuilder GenerateValidationSummary(
673674
}
674675
var messageTag = new TagBuilder(headerTag);
675676
messageTag.SetInnerText(message);
676-
wrappedMessage.AppendLine(messageTag.ToHtmlContent(TagRenderMode.Normal));
677+
wrappedMessage.AppendLine(messageTag);
677678
}
678679
else
679680
{
@@ -696,7 +697,7 @@ public virtual TagBuilder GenerateValidationSummary(
696697
{
697698
var listItem = new TagBuilder("li");
698699
listItem.SetInnerText(errorText);
699-
htmlSummary.AppendLine(listItem.ToHtmlContent(TagRenderMode.Normal));
700+
htmlSummary.AppendLine(listItem);
700701
isHtmlSummaryModified = true;
701702
}
702703
}
@@ -726,7 +727,7 @@ public virtual TagBuilder GenerateValidationSummary(
726727

727728
var innerContent = new BufferedHtmlContent();
728729
innerContent.Append(wrappedMessage);
729-
innerContent.Append(unorderedList.ToHtmlContent(TagRenderMode.Normal));
730+
innerContent.Append(unorderedList);
730731
tagBuilder.InnerHtml = innerContent;
731732

732733
if (formContext != null && !excludePropertyErrors)
@@ -1015,6 +1016,7 @@ protected virtual TagBuilder GenerateInput(
10151016
}
10161017

10171018
var tagBuilder = new TagBuilder("input");
1019+
tagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
10181020
tagBuilder.MergeAttributes(htmlAttributes);
10191021
tagBuilder.MergeAttribute("type", GetInputTypeString(inputType));
10201022
tagBuilder.MergeAttribute("name", fullName, replaceExisting: true);
@@ -1302,12 +1304,9 @@ private IHtmlContent GenerateGroupsAndOptions(string optionLabel, IEnumerable<Se
13021304
foreach (var group in groupedSelectList)
13031305
{
13041306
var optGroup = group.First().Group;
1305-
1306-
// Wrap if requested.
1307-
TagBuilder groupBuilder = null;
13081307
if (optGroup != null)
13091308
{
1310-
groupBuilder = new TagBuilder("optgroup");
1309+
var groupBuilder = new TagBuilder("optgroup");
13111310
if (optGroup.Name != null)
13121311
{
13131312
groupBuilder.MergeAttribute("label", optGroup.Name);
@@ -1318,17 +1317,21 @@ private IHtmlContent GenerateGroupsAndOptions(string optionLabel, IEnumerable<Se
13181317
groupBuilder.MergeAttribute("disabled", "disabled");
13191318
}
13201319

1321-
listItemBuilder.AppendLine(groupBuilder.ToHtmlContent(TagRenderMode.StartTag));
1322-
}
1320+
var optGroupContent = new BufferedHtmlContent().Append(Environment.NewLine);
1321+
foreach (var item in group)
1322+
{
1323+
optGroupContent.AppendLine(GenerateOption(item));
1324+
}
13231325

1324-
foreach (var item in group)
1325-
{
1326-
listItemBuilder.AppendLine(GenerateOption(item));
1326+
groupBuilder.InnerHtml = optGroupContent;
1327+
listItemBuilder.AppendLine(groupBuilder);
13271328
}
1328-
1329-
if (optGroup != null)
1329+
else
13301330
{
1331-
listItemBuilder.AppendLine(groupBuilder.ToHtmlContent(TagRenderMode.EndTag));
1331+
foreach (var item in group)
1332+
{
1333+
listItemBuilder.AppendLine(GenerateOption(item));
1334+
}
13321335
}
13331336
}
13341337

@@ -1338,7 +1341,7 @@ private IHtmlContent GenerateGroupsAndOptions(string optionLabel, IEnumerable<Se
13381341
private IHtmlContent GenerateOption(SelectListItem item)
13391342
{
13401343
var tagBuilder = GenerateOption(item, item.Text);
1341-
return tagBuilder.ToHtmlContent(TagRenderMode.Normal);
1344+
return tagBuilder;
13421345
}
13431346
}
13441347
}

0 commit comments

Comments
 (0)