diff --git a/Mvc.NoFun.sln b/Mvc.NoFun.sln
index 958a6bff24..360ba19994 100644
--- a/Mvc.NoFun.sln
+++ b/Mvc.NoFun.sln
@@ -271,9 +271,7 @@ Global
{4DA2D7C1-A7B6-4C01-B57D-89E6EA4609DE}.Release|x86.ActiveCfg = Release|Any CPU
{4DA2D7C1-A7B6-4C01-B57D-89E6EA4609DE}.Release|x86.Build.0 = Release|Any CPU
{F504357E-C2E1-4818-BA5C-9A2EAC25FEE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F504357E-C2E1-4818-BA5C-9A2EAC25FEE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F504357E-C2E1-4818-BA5C-9A2EAC25FEE5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {F504357E-C2E1-4818-BA5C-9A2EAC25FEE5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F504357E-C2E1-4818-BA5C-9A2EAC25FEE5}.Debug|x86.ActiveCfg = Debug|Any CPU
{F504357E-C2E1-4818-BA5C-9A2EAC25FEE5}.Debug|x86.Build.0 = Debug|Any CPU
{F504357E-C2E1-4818-BA5C-9A2EAC25FEE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -378,6 +376,7 @@ Global
{F21E225B-190B-4DAA-8B0A-05986D231F56}.Release|x86.ActiveCfg = Release|Any CPU
{F21E225B-190B-4DAA-8B0A-05986D231F56}.Release|x86.Build.0 = Release|Any CPU
{3F8B8FC1-9FE4-4788-8991-367113E8D7AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3F8B8FC1-9FE4-4788-8991-367113E8D7AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F8B8FC1-9FE4-4788-8991-367113E8D7AD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{3F8B8FC1-9FE4-4788-8991-367113E8D7AD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{3F8B8FC1-9FE4-4788-8991-367113E8D7AD}.Debug|x86.ActiveCfg = Debug|Any CPU
diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorTextWriter.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorTextWriter.cs
index 09a50c0f38..f4d325d821 100644
--- a/src/Microsoft.AspNet.Mvc.Razor/RazorTextWriter.cs
+++ b/src/Microsoft.AspNet.Mvc.Razor/RazorTextWriter.cs
@@ -2,9 +2,11 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
+using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
+using Microsoft.AspNet.Html.Abstractions;
using Microsoft.AspNet.Mvc.Razor.Internal;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.Framework.Internal;
@@ -30,9 +32,12 @@ namespace Microsoft.AspNet.Mvc.Razor
/// The to write output to when this instance
/// is no longer buffering.
/// The character in which the output is written.
- public RazorTextWriter(TextWriter unbufferedWriter, Encoding encoding)
+ /// The HTML encoder.
+ public RazorTextWriter(TextWriter unbufferedWriter, Encoding encoding, IHtmlEncoder encoder)
{
UnbufferedWriter = unbufferedWriter;
+ HtmlEncoder = encoder;
+
BufferedWriter = new StringCollectionTextWriter(encoding);
TargetWriter = BufferedWriter;
}
@@ -53,8 +58,7 @@ namespace Microsoft.AspNet.Mvc.Razor
private TextWriter TargetWriter { get; set; }
- [RazorInject]
- private IHtmlEncoder HtmlEncoder { get; set; }
+ private IHtmlEncoder HtmlEncoder { get; }
///
public override void Write(char value)
@@ -65,10 +69,10 @@ namespace Microsoft.AspNet.Mvc.Razor
///
public override void Write(object value)
{
- var htmlString = value as HtmlString;
- if (htmlString != null)
+ var htmlContent = value as IHtmlContent;
+ if (htmlContent != null)
{
- htmlString.WriteTo(TargetWriter, HtmlEncoder);
+ htmlContent.WriteTo(TargetWriter, HtmlEncoder);
return;
}
diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs
index 332c6aec06..574f1026b4 100644
--- a/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs
+++ b/src/Microsoft.AspNet.Mvc.Razor/RazorView.cs
@@ -9,6 +9,7 @@ using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.PageExecutionInstrumentation;
using Microsoft.Framework.Internal;
+using Microsoft.Framework.WebEncoders;
namespace Microsoft.AspNet.Mvc.Razor
{
@@ -21,6 +22,7 @@ namespace Microsoft.AspNet.Mvc.Razor
private readonly IRazorViewEngine _viewEngine;
private readonly IRazorPageActivator _pageActivator;
private readonly IViewStartProvider _viewStartProvider;
+ private readonly IHtmlEncoder _htmlEncoder;
private IPageExecutionListenerFeature _pageExecutionFeature;
///
@@ -30,18 +32,21 @@ namespace Microsoft.AspNet.Mvc.Razor
/// The used to activate pages.
/// The used for discovery of _ViewStart
/// The instance to execute.
+ /// The HTML encoder.
/// Determines if the view is to be executed as a partial.
/// pages
public RazorView(IRazorViewEngine viewEngine,
IRazorPageActivator pageActivator,
IViewStartProvider viewStartProvider,
IRazorPage razorPage,
+ IHtmlEncoder htmlEncoder,
bool isPartial)
{
_viewEngine = viewEngine;
_pageActivator = pageActivator;
_viewStartProvider = viewStartProvider;
RazorPage = razorPage;
+ _htmlEncoder = htmlEncoder;
IsPartial = isPartial;
}
@@ -77,11 +82,12 @@ namespace Microsoft.AspNet.Mvc.Razor
await RenderLayoutAsync(context, bodyWriter);
}
- private async Task RenderPageAsync(IRazorPage page,
- ViewContext context,
- bool executeViewStart)
+ private async Task RenderPageAsync(
+ IRazorPage page,
+ ViewContext context,
+ bool executeViewStart)
{
- var razorTextWriter = new RazorTextWriter(context.Writer, context.Writer.Encoding);
+ var razorTextWriter = new RazorTextWriter(context.Writer, context.Writer.Encoding, _htmlEncoder);
var writer = (TextWriter)razorTextWriter;
var bufferedWriter = (IBufferedTextWriter)razorTextWriter;
diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorViewFactory.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorViewFactory.cs
index 2c40c81074..6ac913d358 100644
--- a/src/Microsoft.AspNet.Mvc.Razor/RazorViewFactory.cs
+++ b/src/Microsoft.AspNet.Mvc.Razor/RazorViewFactory.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.Framework.Internal;
+using Microsoft.Framework.WebEncoders;
namespace Microsoft.AspNet.Mvc.Razor
{
@@ -12,6 +13,7 @@ namespace Microsoft.AspNet.Mvc.Razor
///
public class RazorViewFactory : IRazorViewFactory
{
+ private readonly IHtmlEncoder _htmlEncoder;
private readonly IRazorPageActivator _pageActivator;
private readonly IViewStartProvider _viewStartProvider;
@@ -22,10 +24,12 @@ namespace Microsoft.AspNet.Mvc.Razor
/// The used for discovery of _ViewStart
/// pages
public RazorViewFactory(IRazorPageActivator pageActivator,
- IViewStartProvider viewStartProvider)
+ IViewStartProvider viewStartProvider,
+ IHtmlEncoder htmlEncoder)
{
_pageActivator = pageActivator;
_viewStartProvider = viewStartProvider;
+ _htmlEncoder = htmlEncoder;
}
///
@@ -33,7 +37,13 @@ namespace Microsoft.AspNet.Mvc.Razor
[NotNull] IRazorPage page,
bool isPartial)
{
- var razorView = new RazorView(viewEngine, _pageActivator, _viewStartProvider, page, isPartial);
+ var razorView = new RazorView(
+ viewEngine,
+ _pageActivator,
+ _viewStartProvider,
+ page,
+ _htmlEncoder,
+ isPartial);
return razorView;
}
}
diff --git a/src/Microsoft.AspNet.Mvc.Razor/TagHelperContentWrapperTextWriter.cs b/src/Microsoft.AspNet.Mvc.Razor/TagHelperContentWrapperTextWriter.cs
index 1f972f340d..ba2e305015 100644
--- a/src/Microsoft.AspNet.Mvc.Razor/TagHelperContentWrapperTextWriter.cs
+++ b/src/Microsoft.AspNet.Mvc.Razor/TagHelperContentWrapperTextWriter.cs
@@ -44,13 +44,13 @@ namespace Microsoft.AspNet.Mvc.Razor
///
public override void Write(string value)
{
- Content.Append(value);
+ Content.AppendEncoded(value);
}
///
public override void Write(char value)
{
- Content.Append(value.ToString());
+ Content.AppendEncoded(value.ToString());
}
///
diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs
index da224795ef..b08228cb83 100644
--- a/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs
+++ b/src/Microsoft.AspNet.Mvc.TagHelpers/LinkTagHelper.cs
@@ -7,6 +7,7 @@ using System.Globalization;
using System.Linq;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Mvc.Razor.TagHelpers;
+using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.TagHelpers.Internal;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.Framework.Caching.Memory;
@@ -265,7 +266,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Only HrefInclude is specified. Don't render the original tag.
output.TagName = null;
- output.Content.SetContent(string.Empty);
+ output.Content.SetContent(HtmlString.Empty);
}
}
@@ -323,26 +324,27 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
}
}
- builder.Append(Environment.NewLine);
+ builder.Append(HtmlString.NewLine);
// Build the tag that's used to test for the presence of the stylesheet
- builder.AppendFormat(
- CultureInfo.InvariantCulture,
- "",
- HtmlEncoder.HtmlEncode(FallbackTestClass));
+ builder
+ .AppendEncoded("");
// Build the tag that checks the effective style of tag above and renders the extra
// tag to load the fallback stylesheet if the test CSS property value is found to be false,
// indicating that the primary stylesheet failed to load.
builder
- .Append("");
+ .AppendEncoded("");
}
}
@@ -370,7 +372,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
private void BuildLinkTag(TagHelperAttributeList attributes, TagHelperContent builder)
{
- builder.Append("");
+ builder.AppendEncoded("/>");
}
private enum Mode
diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs
index 3b678d07c1..b974cef782 100644
--- a/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs
+++ b/src/Microsoft.AspNet.Mvc.TagHelpers/ScriptTagHelper.cs
@@ -282,10 +282,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
if (fallbackSrcs.Any())
{
// Build the ");
+ builder.AppendEncoded("\"));");
}
}
@@ -360,7 +360,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
TagHelperAttributeList attributes,
TagHelperContent builder)
{
- builder.Append("");
+ builder.AppendEncoded(">");
}
private void AppendAttribute(TagHelperContent content, string key, object value, bool escapeQuotes)
{
content
- .Append(" ")
- .Append(key);
+ .AppendEncoded(" ")
+ .AppendEncoded(key);
if (escapeQuotes)
{
// Passed only JavaScript-encoded strings in this case. Do not perform HTML-encoding as well.
content
- .Append("=\\\"")
- .Append((string)value)
- .Append("\\\"");
+ .AppendEncoded("=\\\"")
+ .AppendEncoded((string)value)
+ .AppendEncoded("\\\"");
}
else
{
// HTML-encoded the given value if necessary.
content
- .Append("=\"")
+ .AppendEncoded("=\"")
.Append(HtmlEncoder, ViewContext.Writer.Encoding, value)
- .Append("\"");
+ .AppendEncoded("\"");
}
}
diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultEditorTemplates.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultEditorTemplates.cs
index 9cbffa8f13..010eb39c2b 100644
--- a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultEditorTemplates.cs
+++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultEditorTemplates.cs
@@ -283,7 +283,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var innerContent = new BufferedHtmlContent();
innerContent.Append(templateBuilderResult);
- innerContent.Append(" ");
+ innerContent.AppendEncoded(" ");
innerContent.Append(htmlHelper.ValidationMessage(
propertyMetadata.PropertyName,
message: null,
diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultHtmlGenerator.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultHtmlGenerator.cs
index 731bc5fc30..cad068673d 100644
--- a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultHtmlGenerator.cs
+++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/Html/DefaultHtmlGenerator.cs
@@ -539,8 +539,8 @@ namespace Microsoft.AspNet.Mvc.Rendering
// The first newline is always trimmed when a TextArea is rendered, so we add an extra one
// in case the value being rendered is something like "\r\nHello".
var innerContent = new BufferedHtmlContent();
- innerContent.Append(Environment.NewLine);
- innerContent.Append(new StringHtmlContent(value));
+ innerContent.Append(HtmlString.NewLine);
+ innerContent.Append(value);
tagBuilder.InnerHtml = innerContent;
return tagBuilder;
@@ -704,7 +704,8 @@ namespace Microsoft.AspNet.Mvc.Rendering
if (!isHtmlSummaryModified)
{
- htmlSummary.AppendLine(HiddenListItem);
+ htmlSummary.AppendEncoded(HiddenListItem);
+ htmlSummary.Append(HtmlString.NewLine);
}
var unorderedList = new TagBuilder("ul")
@@ -1316,7 +1317,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
groupBuilder.MergeAttribute("disabled", "disabled");
}
- var optGroupContent = new BufferedHtmlContent().Append(Environment.NewLine);
+ var optGroupContent = new BufferedHtmlContent().Append(HtmlString.NewLine);
foreach (var item in group)
{
optGroupContent.AppendLine(GenerateOption(item));
diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/HtmlString.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/HtmlString.cs
index 8fe7dea830..dfe2267d84 100644
--- a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/HtmlString.cs
+++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/HtmlString.cs
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+using System;
using System.IO;
using Microsoft.AspNet.Html.Abstractions;
using Microsoft.Framework.Internal;
@@ -20,6 +21,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
///
public static readonly HtmlString Empty = new HtmlString(string.Empty);
+ ///
+ /// Returns an containing .
+ ///
+ public static readonly HtmlString NewLine = new HtmlString(Environment.NewLine);
+
///
/// Creates a new instance of .
///
diff --git a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/StringCollectionTextWriter.cs b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/StringCollectionTextWriter.cs
index fe7b711f60..ceadacb064 100644
--- a/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/StringCollectionTextWriter.cs
+++ b/src/Microsoft.AspNet.Mvc.ViewFeatures/Rendering/StringCollectionTextWriter.cs
@@ -2,9 +2,11 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
+using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
+using Microsoft.AspNet.Html.Abstractions;
using Microsoft.Framework.Internal;
using Microsoft.Framework.WebEncoders;
@@ -19,8 +21,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
///
public class StringCollectionTextWriter : TextWriter
{
+ private const int MaxCharToStringLength = 1024;
private static readonly Task _completedTask = Task.FromResult(0);
+
private readonly Encoding _encoding;
+ private readonly StringCollectionTextWriterContent _content;
///
/// Creates a new instance of .
@@ -29,7 +34,8 @@ namespace Microsoft.AspNet.Mvc.Rendering
public StringCollectionTextWriter(Encoding encoding)
{
_encoding = encoding;
- Content = new BufferedHtmlContent();
+ Entries = new List