diff --git a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/ITagHelper.cs b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/ITagHelper.cs
index 1b716db0a1..51a9265b38 100644
--- a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/ITagHelper.cs
+++ b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/ITagHelper.cs
@@ -10,6 +10,12 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
///
public interface ITagHelper
{
+ ///
+ /// Gets the execution order of this relative to others targeting the same element.
+ /// instances with lower values are executed first.
+ ///
+ int Order { get; }
+
///
/// Asynchronously executes the with the given and
/// .
diff --git a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelper.cs b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelper.cs
index 565343e020..2f26c482bd 100644
--- a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelper.cs
+++ b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelper.cs
@@ -10,6 +10,10 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
///
public abstract class TagHelper : ITagHelper
{
+ ///
+ /// Default order is 0.
+ public virtual int Order { get; } = 0;
+
///
/// Synchronously executes the with the given and
/// .
diff --git a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperRunner.cs b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperRunner.cs
index 8da31ff45f..add873c256 100644
--- a/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperRunner.cs
+++ b/src/Microsoft.AspNet.Razor.Runtime/TagHelpers/TagHelperRunner.cs
@@ -1,6 +1,7 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
@@ -24,8 +25,9 @@ namespace Microsoft.AspNet.Razor.Runtime.TagHelpers
executionContext.UniqueId,
executionContext.GetChildContentAsync);
var tagHelperOutput = new TagHelperOutput(executionContext.TagName, executionContext.HTMLAttributes);
+ var orderedTagHelpers = executionContext.TagHelpers.OrderBy(tagHelper => tagHelper.Order);
- foreach (var tagHelper in executionContext.TagHelpers)
+ foreach (var tagHelper in orderedTagHelpers)
{
await tagHelper.ProcessAsync(tagHelperContext, tagHelperOutput);
}