Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit 08eac45

Browse files
committed
Moving FlushPoint behavior to RazorTextWriter
1 parent da6930e commit 08eac45

File tree

17 files changed

+749
-188
lines changed

17 files changed

+749
-188
lines changed

samples/MvcSample.Web/Views/Home/FlushPoint.cshtml

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -45,47 +45,18 @@
4545
<strong>Marketing:</strong> <a href="mailto:[email protected]">Marketing@example.com</a>
4646
</address>
4747

48-
@* Todo replace with await when we have support for async sections *@
49-
@{
50-
System.Threading.Thread.Sleep(1000);
48+
@* Remove the Wait() calls once we add support for async sections *@
49+
@{
50+
FlushAsync().Wait();
51+
Task.Delay(TimeSpan.FromSeconds(1)).Wait();
5152
}
5253
<div class="row">
5354
<div class="col-md-6">
54-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus suscipit ut neque nec vestibulum. Donec at elit nisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque fringilla sit amet diam ac tempus. Maecenas ornare quam at facilisis dapibus. Aenean at eros rhoncus, viverra augue nec, viverra sem. In posuere malesuada ultricies. Nulla eu convallis dolor.
55-
5655
Integer pharetra dignissim tortor, quis facilisis tellus faucibus in. Phasellus fringilla pellentesque justo eu tempor. Sed eget viverra lacus, eget gravida turpis. Donec dapibus sodales leo, non pharetra lacus volutpat quis. Quisque et auctor nulla. Nunc a orci ut libero luctus ornare ut eget erat. Integer eu risus tempor, scelerisque lacus nec, dignissim nisl. Ut ac leo nec velit tempus fringilla. Phasellus id nisi tortor. Aliquam magna nunc, congue eget sem quis, porta accumsan magna. Sed sit amet dapibus sem, placerat malesuada felis. Quisque vel dui ut est luctus congue.
57-
58-
Curabitur non vulputate diam. Nulla molestie non felis quis tincidunt. Suspendisse vel sapien vitae nunc eleifend venenatis. Nunc ut ante ut massa volutpat bibendum. Mauris ut mi dui. Aliquam quam nunc, venenatis ac velit vel, tempus suscipit massa. Vestibulum posuere est sit amet nibh facilisis, et ultricies quam tristique. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.
59-
60-
Suspendisse id nisi sed mauris luctus eleifend. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed pharetra leo eu augue lacinia pretium. In hac habitasse platea dictumst. Ut a tortor non nunc congue pretium ut sit amet nulla. Aenean et laoreet nisi, vel ornare neque. Vestibulum dui metus, mattis a velit eu, placerat accumsan nunc. Nam sit amet lectus venenatis, tincidunt justo ut, tincidunt lorem. Nullam fringilla sem purus, sed semper justo euismod nec. Vivamus nec faucibus elit. Integer feugiat convallis mi non pellentesque. Fusce id nulla ultricies, blandit lectus convallis, mollis turpis. Aenean et fringilla ante.
61-
62-
Aliquam eget tortor dui. Proin pharetra, nunc nec dapibus ornare, turpis sapien tempus metus, non suscipit turpis tellus laoreet justo. Aenean feugiat condimentum accumsan. Nam in gravida augue. Maecenas non eros lobortis, dictum sem sed, laoreet libero. Cras condimentum quis sem nec lobortis. Duis quis massa sagittis, ultrices libero et, varius turpis. Pellentesque consequat aliquet erat, eu ultricies orci viverra at. Aenean porttitor, felis non mollis ornare, quam dui fermentum nunc, in lobortis nunc ligula ut nibh. Curabitur erat nulla, feugiat dapibus porta quis, commodo et orci. Praesent nec erat dui. Phasellus enim diam, egestas sed augue eget, volutpat vulputate magna. Cras neque augue, condimentum in orci ac, lacinia molestie leo. Sed ut lectus erat. Duis sed pretium arcu. Aenean molestie diam in arcu posuere faucibus a et enim.
63-
64-
Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed commodo posuere mauris ut tempus. Ut vulputate lacinia turpis, nec semper sapien adipiscing id. Vivamus et fermentum nunc. Proin ullamcorper sed tortor eu porttitor. Cras ante dui, elementum id lectus eu, laoreet viverra lacus. Nam feugiat convallis massa eu tempus. Nunc quis dictum dui. Nullam non euismod tortor.
65-
66-
Nam quis lacinia enim. Sed tristique rhoncus purus et congue. Quisque adipiscing vulputate tellus, placerat iaculis neque ultrices quis. Aenean lorem sem, volutpat eu mi et, imperdiet luctus lectus. Pellentesque tincidunt velit et elit accumsan faucibus. Ut a enim vulputate, scelerisque erat quis, vestibulum tortor. Nulla lacus neque, tempus et auctor vitae, blandit quis turpis. Nam id hendrerit nisl. Vestibulum et molestie nulla, sed egestas tellus. Aliquam erat volutpat. Ut fermentum commodo tempor. Quisque consectetur tempor hendrerit.
6756
</div>
6857

6958
<div class="col-md-6">
70-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris nec erat ligula. Fusce accumsan justo at libero eleifend ullamcorper id at dolor. Morbi id odio sed magna tristique mollis. Cras nec adipiscing leo, in tristique ante. Phasellus egestas, elit eget scelerisque feugiat, lacus erat lacinia est, in pellentesque nunc turpis nec orci. Donec cursus velit quis consectetur laoreet. Nulla condimentum nunc non enim congue elementum. Maecenas vel tellus at nibh commodo egestas.
71-
7259
Aliquam nec elementum orci, ut interdum mi. Sed lorem lacus, malesuada in nisi a, auctor lobortis ipsum. Ut id erat suscipit, pharetra dui eu, sodales erat. Duis nibh turpis, vestibulum sit amet leo vitae, faucibus iaculis lectus. Nam lacinia purus fringilla dolor dictum posuere nec in libero. Integer id tempor elit. Mauris adipiscing ut sem id tincidunt. Cras turpis elit, dignissim vitae adipiscing vitae, ullamcorper in felis. Nullam et adipiscing neque. Integer ullamcorper eget tortor in sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse pretium tristique libero, ut gravida est placerat quis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sed lorem cursus, porttitor nibh eu, bibendum turpis.
73-
74-
Curabitur sollicitudin et lorem non molestie. Phasellus eu suscipit orci. Nulla vitae turpis metus. Ut laoreet molestie ante ac accumsan. Sed pharetra, mi eget aliquet lobortis, velit eros pellentesque arcu, nec eleifend metus justo sit amet nisl. Aliquam tincidunt in lectus vel elementum. Aliquam libero lorem, consectetur non ipsum et, interdum sodales risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Phasellus eu condimentum neque.
75-
76-
Phasellus id elit nunc. Aliquam ipsum mauris, facilisis sit amet orci ac, consectetur hendrerit massa. Aliquam justo velit, cursus scelerisque viverra ac, varius vel lacus. Curabitur tortor odio, aliquet ornare ultricies ac, placerat vitae turpis. Cras placerat nunc at vehicula dapibus. Fusce velit magna, ultrices sed ipsum eget, aliquet gravida nibh. Vivamus id dui diam. Vestibulum id pellentesque purus, sit amet tempus turpis. Praesent dapibus pretium lectus, id laoreet ligula semper a. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras sit amet velit mattis, hendrerit ligula sed, viverra enim. Nulla volutpat lacus id lectus dictum ultrices sed id lacus. Nulla leo massa, consectetur venenatis libero sit amet, fermentum euismod leo. Sed scelerisque laoreet sapien, sed malesuada enim tempus nec. Aliquam eu malesuada felis, ac consequat magna.
77-
78-
Fusce nec sapien ut nunc vulputate lacinia. Cras vel massa blandit, fringilla dui eget, adipiscing diam. Ut vel orci at massa commodo iaculis eu a mi. In metus turpis, lacinia vel diam consectetur, imperdiet ullamcorper tellus. Ut non sagittis velit. Duis quis tincidunt sapien, quis aliquet orci. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam erat volutpat. Ut eget tempor lacus. Nunc eget dui quis libero posuere luctus. Proin tempus sodales egestas. Donec et hendrerit lorem, dapibus posuere neque. Pellentesque in justo enim. Ut ornare augue quis enim tincidunt, at porta urna volutpat. Quisque pellentesque dictum gravida. Cras nec magna vitae elit tincidunt tristique.
79-
80-
Cras quis libero tortor. Pellentesque nec consequat sapien. Nullam quis mauris cursus, scelerisque diam in, interdum metus. Quisque rhoncus nibh vel neque vehicula, a fermentum mi fringilla. Mauris feugiat elementum tellus, at facilisis purus sollicitudin non. Cras laoreet hendrerit dui, ac gravida tellus porttitor eget. Suspendisse nec tempor augue. Nulla facilisi. Sed libero est, eleifend non lacinia et, vehicula a ante. Praesent in mollis arcu, sit amet euismod orci. Curabitur mauris enim, congue eu fringilla at, laoreet ut enim. Aliquam tempus vel libero a porta. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis consectetur, turpis dictum consectetur adipiscing, est augue faucibus mi, tincidunt malesuada est sapien a lectus.
81-
82-
Curabitur porta ut sapien eu iaculis. Aliquam eleifend adipiscing sapien in ornare. Aliquam sed nisl vehicula, commodo urna a, ultricies leo. Aenean fermentum justo iaculis neque scelerisque congue. Suspendisse potenti. Sed commodo tempus nisl et blandit. Nunc mollis vestibulum ornare. Fusce libero ante, tempus vel bibendum eget, consequat eget dolor. Maecenas consectetur tristique ipsum, quis condimentum tortor dignissim ac. Nam viverra, tortor nec venenatis ultrices, odio sapien volutpat ipsum, at interdum eros nunc sit amet velit. Maecenas accumsan purus sit amet mi tincidunt, laoreet fermentum augue malesuada. Aenean venenatis molestie sapien sit amet ullamcorper. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
83-
84-
Donec rhoncus tincidunt felis quis accumsan. Aenean cursus ante lectus, eget ullamcorper ante dignissim vitae. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce pharetra metus a tortor iaculis lacinia. Nunc aliquet odio sit amet arcu cursus, eget accumsan eros ultrices. Etiam suscipit facilisis est et gravida. Nam euismod mollis nunc, eget aliquam risus volutpat nec. Nulla tempor est sapien, pretium sagittis dui euismod eget. Vestibulum est augue, iaculis a dictum sit amet, euismod auctor tortor.
85-
86-
Sed ultricies pretium erat eget porttitor. Ut pharetra diam ut pretium rutrum. Fusce placerat orci id nisl sodales, id posuere velit placerat. Mauris eget dui commodo, venenatis velit quis, lacinia tortor. Suspendisse laoreet vehicula libero eu rutrum. Aenean pharetra, nisl sit amet posuere tempus, enim diam fermentum magna, non bibendum nulla libero ut nunc. Nullam turpis odio, egestas nec metus sit amet, sollicitudin volutpat massa. Etiam et adipiscing enim. Proin quis nulla non metus accumsan vulputate sed eu mi. Duis commodo risus vitae bibendum eleifend. In dictum, dolor vel lobortis suscipit, augue nisi fermentum leo, et vehicula arcu velit sit amet augue. Aliquam sed sollicitudin dolor, quis blandit massa.
87-
88-
Suspendisse tincidunt sit amet tellus non dignissim. In nulla enim, interdum eget viverra et, sagittis id urna. Donec arcu quam, iaculis ut interdum aliquam, aliquet et purus. Proin vitae tortor lorem. Aliquam interdum magna erat, vel ultrices risus accumsan vel. Ut vel adipiscing dui. Pellentesque faucibus libero at odio tincidunt, id porttitor augue sodales. Sed sagittis magna nisi, sit amet adipiscing quam scelerisque sed. Phasellus venenatis nisl odio.
8960
</div>
9061
</div>
9162
}

src/Microsoft.AspNet.Mvc.Razor/BufferEntryCollection.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ public void Add([NotNull] BufferEntryCollection buffer)
7272
_buffer.Add(buffer.BufferEntries);
7373
}
7474

75+
/// <summary>
76+
/// Removes all all entries from this <see cref="BufferEntryCollection"/>.
77+
/// </summary>
78+
public void Clear()
79+
{
80+
_buffer.Clear();
81+
}
82+
7583
/// <inheritdoc />
7684
public IEnumerator<string> GetEnumerator()
7785
{

src/Microsoft.AspNet.Mvc.Razor/HelperResult.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,35 @@
66

77
namespace Microsoft.AspNet.Mvc.Razor
88
{
9+
/// <summary>
10+
/// Represents a deferred write operation in a <see cref="RazorPage"/>.
11+
/// </summary>
912
public class HelperResult
1013
{
1114
private readonly Action<TextWriter> _action;
1215

16+
/// <summary>
17+
/// Creates a new instance of <see cref="HelperResult"/>.
18+
/// </summary>
19+
/// <param name="action">The delegate to invoke when <see cref="WriteTo(TextWriter)"/> is called.</param>
1320
public HelperResult([NotNull] Action<TextWriter> action)
1421
{
1522
_action = action;
1623
}
1724

18-
public void WriteTo([NotNull] TextWriter writer)
25+
/// <summary>
26+
/// Gets the delegate to invoke when <see cref="WriteTo(TextWriter)"/> is called.
27+
/// </summary>
28+
public Action<TextWriter> WriteAction
29+
{
30+
get { return _action; }
31+
}
32+
33+
/// <summary>
34+
/// Method invoked to produce content from the <see cref="HelperResult"/>.
35+
/// </summary>
36+
/// <param name="writer">The <see cref="TextWriter"/> instance to write to.</param>
37+
public virtual void WriteTo([NotNull] TextWriter writer)
1938
{
2039
_action(writer);
2140
}

src/Microsoft.AspNet.Mvc.Razor/IRazorPage.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ public interface IRazorPage
2424
// TODO: https://github.com/aspnet/Mvc/issues/845 tracks making this async
2525
Action<TextWriter> RenderBodyDelegate { get; set; }
2626

27-
/// <summary>
28-
/// Gets or sets the delegate that is invoked when a flush point is encountered.
29-
/// </summary>
30-
Func<Task> FlushPointDelegate { get; set; }
31-
3227
/// <summary>
3328
/// Gets the application base relative path to the page.
3429
/// </summary>

src/Microsoft.AspNet.Mvc.Razor/Properties/Resources.Designer.cs

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Microsoft.AspNet.Mvc.Razor/RazorPage.cs

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ namespace Microsoft.AspNet.Mvc.Razor
1919
/// </summary>
2020
public abstract class RazorPage : IRazorPage
2121
{
22-
private IUrlHelper _urlHelper;
22+
private static readonly object _renderingSectionKey = new object();
2323
private readonly HashSet<string> _renderedSections = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
24+
private IUrlHelper _urlHelper;
2425
private bool _renderedBody;
2526

2627
public RazorPage()
@@ -90,9 +91,6 @@ public dynamic ViewBag
9091
/// <inheritdoc />
9192
public Action<TextWriter> RenderBodyDelegate { get; set; }
9293

93-
/// <inheritdoc />
94-
public Func<Task> FlushPointDelegate { get; set; }
95-
9694
/// <inheritdoc />
9795
public Dictionary<string, HelperResult> PreviousSectionWriters { get; set; }
9896

@@ -286,13 +284,19 @@ protected virtual HelperResult RenderBody()
286284
return new HelperResult(RenderBodyDelegate);
287285
}
288286

289-
public void DefineSection(string name, HelperResult action)
287+
/// <summary>
288+
/// Creates a named content section in the page that can be invoked in a Layout page using
289+
/// <see cref="RenderSection(string)"/> or <see cref="RenderSection(string, bool)"/>.
290+
/// </summary>
291+
/// <param name="name">The name of the section to create.</param>
292+
/// <param name="section">The <see cref="HelperResult"/> to execute when rendering the section.</param>
293+
public void DefineSection(string name, HelperResult section)
290294
{
291295
if (SectionWriters.ContainsKey(name))
292296
{
293297
throw new InvalidOperationException(Resources.FormatSectionAlreadyDefined(name));
294298
}
295-
SectionWriters[name] = action;
299+
SectionWriters[name] = new SectionResult(section, Context);
296300
}
297301

298302
public bool IsSectionDefined([NotNull] string name)
@@ -331,22 +335,18 @@ public HelperResult RenderSection([NotNull] string name, bool required)
331335
return null;
332336
}
333337
}
334-
335-
/// <summary>
336-
/// Invokes the <see cref="FlushPointDelegate"/> if it is set.
337-
/// </summary>
338-
/// <returns>A <see cref="Task"/> that represents the invocation of the
339-
/// <see cref="FlushPointDelegate"/>.</returns>
340-
public async Task FlushAsync()
338+
339+
public Task FlushAsync()
341340
{
342-
if (FlushPointDelegate == null)
341+
// Calls to Flush are allowed if the page does not specify a Layout or if we're executing as part of a section.
342+
if (!string.IsNullOrEmpty(Layout) &&
343+
!Context.Items.ContainsKey(_renderingSectionKey))
343344
{
344-
var message = Resources.FormatFlushPointCannotBeInvoked(nameof(FlushAsync),
345-
nameof(FlushPointDelegate));
345+
var message = Resources.FormatLayoutCannotBeRendered(nameof(FlushAsync));
346346
throw new InvalidOperationException(message);
347347
}
348348

349-
await FlushPointDelegate();
349+
return Output.FlushAsync();
350350
}
351351

352352
/// <inheritdoc />
@@ -379,5 +379,29 @@ private void EnsureMethodCanBeInvoked(string methodName)
379379
throw new InvalidOperationException(Resources.FormatView_MethodCannotBeCalled(methodName));
380380
}
381381
}
382+
383+
private sealed class SectionResult : HelperResult
384+
{
385+
private readonly HttpContext _context;
386+
387+
public SectionResult(HelperResult writer, HttpContext context)
388+
: base(writer.WriteAction)
389+
{
390+
_context = context;
391+
}
392+
393+
public override void WriteTo([NotNull] TextWriter writer)
394+
{
395+
try
396+
{
397+
_context.Items[_renderingSectionKey] = true;
398+
base.WriteTo(writer);
399+
}
400+
finally
401+
{
402+
_context.Items.Remove(_renderingSectionKey);
403+
}
404+
}
405+
}
382406
}
383407
}

0 commit comments

Comments
 (0)