- Changed all `GetChildContentAsync` calls to come from `TagHelperOutput` instead of `TagHelperContext`.
- Updated `ReaderAtEndOfFormTagHelper` to properly detect changes inside of a `Form`s body by calling the `Init` method.
- Add test to `RenderAtEndOfFormTagHelperTest`.

aspnet/Razor#571
This commit is contained in:
N. Taylor Mullen 2015-10-19 12:54:51 -07:00
parent 0e25470660
commit 0ae83a25e9
28 changed files with 524 additions and 377 deletions

View File

@ -158,7 +158,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// created within this scope get copied to this scope.
using (var link = MemoryCache.CreateLinkingScope())
{
result = await context.GetChildContentAsync();
result = await output.GetChildContentAsync();
MemoryCache.Set(key, result, GetMemoryCacheEntryOptions(link));
}
@ -173,7 +173,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
}
else
{
result = await context.GetChildContentAsync();
result = await output.GetChildContentAsync();
output.Content.SetContent(result);
}
}

View File

@ -77,7 +77,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// </label>
if (!output.IsContentModified)
{
var childContent = await context.GetChildContentAsync();
var childContent = await output.GetChildContentAsync();
if (childContent.IsWhiteSpace)
{

View File

@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
}
else
{
var childContent = await context.GetChildContentAsync();
var childContent = await output.GetChildContentAsync();
selected = encodedValues.Contains(childContent.GetContent());
}

View File

@ -24,6 +24,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
[ViewContext]
public ViewContext ViewContext { get; set; }
/// <inheritdoc />
public override void Init(TagHelperContext context)
{
// Push the new FormContext.
ViewContext.FormContext = new FormContext
{
CanRenderAtEndOfForm = true
};
}
/// <inheritdoc />
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
@ -37,13 +47,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
throw new ArgumentNullException(nameof(output));
}
// Push the new FormContext.
ViewContext.FormContext = new FormContext
{
CanRenderAtEndOfForm = true
};
await context.GetChildContentAsync();
await output.GetChildContentAsync();
var formContext = ViewContext.FormContext;
if (formContext.HasEndOfFormContent)

View File

@ -79,7 +79,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// </span>
if (!output.IsContentModified)
{
var childContent = await context.GetChildContentAsync();
var childContent = await output.GetChildContentAsync();
if (childContent.IsWhiteSpace)
{

View File

@ -1663,7 +1663,10 @@ namespace Microsoft.AspNet.Mvc.Razor
},
startTagHelperWritingScope: () => { },
endTagHelperWritingScope: () => defaultTagHelperContent);
tagHelperExecutionContext.Output = new TagHelperOutput("p", new TagHelperAttributeList());
tagHelperExecutionContext.Output = new TagHelperOutput(
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
if (childContentRetrieved)
{
await tagHelperExecutionContext.GetChildContentAsync(useCachedResult: true);
@ -1695,7 +1698,10 @@ namespace Microsoft.AspNet.Mvc.Razor
executeChildContentAsync: () => { return Task.FromResult(result: true); },
startTagHelperWritingScope: () => { },
endTagHelperWritingScope: () => new DefaultTagHelperContent());
tagHelperExecutionContext.Output = new TagHelperOutput("p", new TagHelperAttributeList());
tagHelperExecutionContext.Output = new TagHelperOutput(
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
tagHelperExecutionContext.Output.Content.AppendEncoded("Hello World!");
// Act
@ -1749,7 +1755,10 @@ namespace Microsoft.AspNet.Mvc.Razor
string postContent,
string postElement)
{
var output = new TagHelperOutput(tagName, attributes)
var output = new TagHelperOutput(
tagName,
attributes,
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()))
{
TagMode = tagMode
};

View File

@ -52,7 +52,8 @@ namespace Microsoft.AspNet.Mvc.Razor.TagHelpers
attributes: new TagHelperAttributeList
{
{ "href", url }
});
},
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
var urlHelperMock = new Mock<IUrlHelper>();
urlHelperMock
.Setup(urlHelper => urlHelper.Content(It.IsAny<string>()))
@ -63,8 +64,7 @@ namespace Microsoft.AspNet.Mvc.Razor.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act
tagHelper.Process(context, tagHelperOutput);
@ -108,7 +108,8 @@ namespace Microsoft.AspNet.Mvc.Razor.TagHelpers
attributes: new TagHelperAttributeList
{
{ "href", url }
});
},
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
var urlHelperMock = new Mock<IUrlHelper>();
urlHelperMock
.Setup(urlHelper => urlHelper.Content(It.IsAny<string>()))
@ -119,8 +120,7 @@ namespace Microsoft.AspNet.Mvc.Razor.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act
tagHelper.Process(context, tagHelperOutput);
@ -141,15 +141,15 @@ namespace Microsoft.AspNet.Mvc.Razor.TagHelpers
attributes: new TagHelperAttributeList
{
{ "href", true }
});
},
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
var tagHelper = new UrlResolutionTagHelper(urlHelper: null, htmlEncoder: null);
var context = new TagHelperContext(
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act
tagHelper.Process(context, tagHelperOutput);
@ -178,7 +178,8 @@ namespace Microsoft.AspNet.Mvc.Razor.TagHelpers
attributes: new TagHelperAttributeList
{
{ "href", new HtmlString(relativeUrl) }
});
},
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
var urlHelperMock = new Mock<IUrlHelper>();
urlHelperMock
.Setup(urlHelper => urlHelper.Content(It.IsAny<string>()))
@ -189,8 +190,7 @@ namespace Microsoft.AspNet.Mvc.Razor.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(

View File

@ -37,18 +37,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{ "asp-protocol", "http" }
},
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something Else");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
attributes: new TagHelperAttributeList
{
{ "id", "myanchor" },
},
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something Else");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
output.Content.SetContent("Something");
@ -94,16 +94,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
"a",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(
"a",
attributes: new TagHelperAttributeList());
output.Content.SetContent(string.Empty);
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
@ -142,16 +142,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
"a",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(
"a",
attributes: new TagHelperAttributeList());
output.Content.SetContent(string.Empty);
var generator = new Mock<IHtmlGenerator>();
@ -205,7 +205,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
attributes: new TagHelperAttributeList
{
{ "href", "http://www.contoso.com" }
});
},
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
if (propertyName == "asp-route-")
{
anchorTagHelper.RouteValues.Add("name", "value");
@ -224,8 +225,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act & Assert
var ex = await Assert.ThrowsAsync<InvalidOperationException>(
@ -251,7 +251,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
typeof(AnchorTagHelper).GetProperty(propertyName).SetValue(anchorTagHelper, "Home");
var output = new TagHelperOutput(
"a",
attributes: new TagHelperAttributeList());
attributes: new TagHelperAttributeList(),
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
var expectedErrorMessage = "Cannot determine an 'href' attribute for <a>. An <a> with a specified " +
"'asp-route' must not have an 'asp-action' or 'asp-controller' attribute.";
@ -259,8 +260,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act & Assert
var ex = await Assert.ThrowsAsync<InvalidOperationException>(

View File

@ -259,8 +259,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
object cacheResult;
cache.Setup(c => c.TryGetValue(It.IsAny<string>(), out cacheResult))
.Returns(false);
var tagHelperContext = GetTagHelperContext(id, childContent);
var tagHelperOutput = new TagHelperOutput("cache", new TagHelperAttributeList());
var tagHelperContext = GetTagHelperContext(id);
var tagHelperOutput = GetTagHelperOutput(
attributes: new TagHelperAttributeList(),
childContent: childContent);
var cacheTagHelper = new CacheTagHelper(cache.Object)
{
ViewContext = GetViewContext(),
@ -298,8 +300,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
object cacheResult;
cache.Setup(c => c.TryGetValue(It.IsAny<string>(), out cacheResult))
.Returns(false);
var tagHelperContext = GetTagHelperContext(id, childContent);
var tagHelperOutput = new TagHelperOutput("cache", new TagHelperAttributeList());
var tagHelperContext = GetTagHelperContext(id);
var tagHelperOutput = GetTagHelperOutput(
attributes: new TagHelperAttributeList(),
childContent: childContent);
var cacheTagHelper = new CacheTagHelper(cache.Object)
{
ViewContext = GetViewContext(),
@ -328,8 +332,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var id = "unique-id";
var childContent = "original-child-content";
var cache = new MemoryCache(new MemoryCacheOptions());
var tagHelperContext1 = GetTagHelperContext(id, childContent);
var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList());
var tagHelperContext1 = GetTagHelperContext(id);
var tagHelperOutput1 = GetTagHelperOutput(
attributes: new TagHelperAttributeList(),
childContent: childContent);
var cacheTagHelper1 = new CacheTagHelper(cache)
{
VaryByQuery = "key1,key2",
@ -348,8 +354,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
Assert.Equal(childContent, tagHelperOutput1.Content.GetContent());
// Arrange - 2
var tagHelperContext2 = GetTagHelperContext(id, "different-content");
var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList());
var tagHelperContext2 = GetTagHelperContext(id);
var tagHelperOutput2 = GetTagHelperOutput(
attributes: new TagHelperAttributeList(),
childContent: "different-content");
var cacheTagHelper2 = new CacheTagHelper(cache)
{
VaryByQuery = "key1,key2",
@ -375,8 +383,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var id = "unique-id";
var childContent1 = "original-child-content";
var cache = new MemoryCache(new MemoryCacheOptions());
var tagHelperContext1 = GetTagHelperContext(id, childContent1);
var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext1 = GetTagHelperContext(id);
var tagHelperOutput1 = GetTagHelperOutput(childContent: childContent1);
tagHelperOutput1.PreContent.Append("<cache>");
tagHelperOutput1.PostContent.SetContent("</cache>");
var cacheTagHelper1 = new CacheTagHelper(cache)
@ -397,8 +405,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Arrange - 2
var childContent2 = "different-content";
var tagHelperContext2 = GetTagHelperContext(id, childContent2);
var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext2 = GetTagHelperContext(id);
var tagHelperOutput2 = GetTagHelperOutput(childContent: childContent2);
tagHelperOutput2.PreContent.SetContent("<cache>");
tagHelperOutput2.PostContent.SetContent("</cache>");
var cacheTagHelper2 = new CacheTagHelper(cache)
@ -565,8 +573,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
clock.SetupGet(p => p.UtcNow)
.Returns(() => currentTime);
var cache = new MemoryCache(new MemoryCacheOptions { Clock = clock.Object });
var tagHelperContext1 = GetTagHelperContext(id, childContent1);
var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext1 = GetTagHelperContext(id);
var tagHelperOutput1 = GetTagHelperOutput(childContent: childContent1);
tagHelperOutput1.PreContent.SetContent("<cache>");
tagHelperOutput1.PostContent.SetContent("</cache>");
var cacheTagHelper1 = new CacheTagHelper(cache)
@ -586,8 +594,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Arrange - 2
var childContent2 = "different-content";
var tagHelperContext2 = GetTagHelperContext(id, childContent2);
var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext2 = GetTagHelperContext(id);
var tagHelperOutput2 = GetTagHelperOutput(childContent: childContent2);
tagHelperOutput2.PreContent.SetContent("<cache>");
tagHelperOutput2.PostContent.SetContent("</cache>");
var cacheTagHelper2 = new CacheTagHelper(cache)
@ -618,8 +626,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
clock.SetupGet(p => p.UtcNow)
.Returns(() => currentTime);
var cache = new MemoryCache(new MemoryCacheOptions { Clock = clock.Object });
var tagHelperContext1 = GetTagHelperContext(id, childContent1);
var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext1 = GetTagHelperContext(id);
var tagHelperOutput1 = GetTagHelperOutput(childContent: childContent1);
tagHelperOutput1.PreContent.SetContent("<cache>");
tagHelperOutput1.PostContent.SetContent("</cache>");
var cacheTagHelper1 = new CacheTagHelper(cache)
@ -640,8 +648,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Arrange - 2
currentTime = currentTime.AddMinutes(5).AddSeconds(2);
var childContent2 = "different-content";
var tagHelperContext2 = GetTagHelperContext(id, childContent2);
var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext2 = GetTagHelperContext(id);
var tagHelperOutput2 = GetTagHelperOutput(childContent: childContent2);
tagHelperOutput2.PreContent.SetContent("<cache>");
tagHelperOutput2.PostContent.SetContent("</cache>");
var cacheTagHelper2 = new CacheTagHelper(cache)
@ -671,8 +679,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
clock.SetupGet(p => p.UtcNow)
.Returns(() => currentTime);
var cache = new MemoryCache(new MemoryCacheOptions { Clock = clock.Object });
var tagHelperContext1 = GetTagHelperContext(id, childContent1);
var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext1 = GetTagHelperContext(id);
var tagHelperOutput1 = GetTagHelperOutput(childContent: childContent1);
tagHelperOutput1.PreContent.SetContent("<cache>");
tagHelperOutput1.PostContent.SetContent("</cache>");
var cacheTagHelper1 = new CacheTagHelper(cache)
@ -693,8 +701,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Arrange - 2
currentTime = currentTime.AddSeconds(35);
var childContent2 = "different-content";
var tagHelperContext2 = GetTagHelperContext(id, childContent2);
var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
var tagHelperContext2 = GetTagHelperContext(id);
var tagHelperOutput2 = GetTagHelperOutput(childContent: childContent2);
tagHelperOutput2.PreContent.SetContent("<cache>");
tagHelperOutput2.PostContent.SetContent("</cache>");
var cacheTagHelper2 = new CacheTagHelper(cache)
@ -727,11 +735,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var tagHelperContext = new TagHelperContext(
allAttributes: new TagHelperAttributeList(),
items: new Dictionary<object, object>(),
uniqueId: id,
uniqueId: id);
var tagHelperOutput = new TagHelperOutput(
"cache",
new TagHelperAttributeList { { "attr", "value" } },
getChildContentAsync: useCachedResult =>
{
TagHelperContent tagHelperContent;
if(!cache.TryGetValue("key1", out tagHelperContent))
if (!cache.TryGetValue("key1", out tagHelperContent))
{
tagHelperContent = expectedContent;
cache.Set("key1", tagHelperContent, cacheEntryOptions);
@ -739,7 +750,6 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
return Task.FromResult(tagHelperContent);
});
var tagHelperOutput = new TagHelperOutput("cache", new TagHelperAttributeList { { "attr", "value" } });
tagHelperOutput.PreContent.SetContent("<cache>");
tagHelperOutput.PostContent.SetContent("</cache>");
var cacheTagHelper = new CacheTagHelper(cache)
@ -778,14 +788,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
new HtmlHelperOptions());
}
private static TagHelperContext GetTagHelperContext(
string id = "testid",
string childContent = "some child content")
private static TagHelperContext GetTagHelperContext(string id = "testid")
{
return new TagHelperContext(
allAttributes: new TagHelperAttributeList(),
items: new Dictionary<object, object>(),
uniqueId: id,
uniqueId: id);
}
private static TagHelperOutput GetTagHelperOutput(
string tagName = "cache",
TagHelperAttributeList attributes = null,
string childContent = "some child content")
{
attributes = attributes ?? new TagHelperAttributeList { { "attr", "value" } };
return new TagHelperOutput(
tagName,
attributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();

View File

@ -80,10 +80,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Test
{
// Arrange
var content = "content";
var context = MakeTagHelperContext(
attributes: new TagHelperAttributeList { { "names", namesAttribute } },
content: content);
var output = MakeTagHelperOutput("environment");
var context = MakeTagHelperContext(attributes: new TagHelperAttributeList { { "names", namesAttribute } });
var output = MakeTagHelperOutput("environment", childContent: content);
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupProperty(h => h.EnvironmentName);
hostingEnvironment.Object.EnvironmentName = environmentName;
@ -108,9 +106,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Test
// Arrange
var content = "content";
var context = MakeTagHelperContext(
attributes: new TagHelperAttributeList { { "names", namesAttribute } },
content: content);
var output = MakeTagHelperOutput("environment");
attributes: new TagHelperAttributeList { { "names", namesAttribute } });
var output = MakeTagHelperOutput("environment", childContent: content);
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupProperty(h => h.EnvironmentName);
hostingEnvironment.Object.EnvironmentName = environmentName;
@ -127,29 +124,32 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Test
Assert.False(output.IsContentModified);
}
private TagHelperContext MakeTagHelperContext(
TagHelperAttributeList attributes = null,
string content = null)
private TagHelperContext MakeTagHelperContext(TagHelperAttributeList attributes = null)
{
attributes = attributes ?? new TagHelperAttributeList();
return new TagHelperContext(
attributes,
items: new Dictionary<object, object>(),
uniqueId: Guid.NewGuid().ToString("N"),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(content);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: Guid.NewGuid().ToString("N"));
}
private TagHelperOutput MakeTagHelperOutput(string tagName, TagHelperAttributeList attributes = null)
private TagHelperOutput MakeTagHelperOutput(
string tagName,
TagHelperAttributeList attributes = null,
string childContent = null)
{
attributes = attributes ?? new TagHelperAttributeList();
return new TagHelperOutput(tagName, attributes);
return new TagHelperOutput(
tagName,
attributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(childContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
}
}
}

View File

@ -42,18 +42,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{ "asp-antiforgery", true }
},
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something Else");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
attributes: new TagHelperAttributeList
{
{ "id", "myform" },
},
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something Else");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
output.PostContent.SetContent("Something");
var urlHelper = new Mock<IUrlHelper>();
@ -111,16 +111,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList());
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
generator
.Setup(mock => mock.GenerateForm(
@ -162,17 +162,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var expectedAttribute = new TagHelperAttribute("asp-ROUTEE-NotRoute", "something");
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var expectedAttribute = new TagHelperAttribute("asp-ROUTEE-NotRoute", "something");
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList());
output.Attributes.Add(expectedAttribute);
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
@ -234,16 +234,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList());
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
generator
.Setup(mock => mock.GenerateForm(
@ -285,16 +285,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList());
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
generator
.Setup(mock => mock.GenerateRouteForm(
@ -350,22 +350,23 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
ViewContext = viewContext,
};
var output = new TagHelperOutput("form",
attributes: new TagHelperAttributeList
{
{ "aCTiON", "my-action" },
});
var context = new TagHelperContext(
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
var output = new TagHelperOutput(
tagName: "form",
attributes: new TagHelperAttributeList
{
{ "aCTiON", "my-action" },
},
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var context = new TagHelperContext(
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test");
// Act
@ -394,7 +395,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
attributes: new TagHelperAttributeList
{
{ "action", "my-action" },
});
},
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
if (propertyName == "asp-route-")
{
formTagHelper.RouteValues.Add("name", "value");
@ -412,8 +414,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act & Assert
var ex = await Assert.ThrowsAsync<InvalidOperationException>(
@ -435,7 +436,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
typeof(FormTagHelper).GetProperty(propertyName).SetValue(formTagHelper, "Home");
var output = new TagHelperOutput(
"form",
attributes: new TagHelperAttributeList());
attributes: new TagHelperAttributeList(),
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
var expectedErrorMessage = "Cannot determine an 'action' attribute for <form>. A <form> with a specified " +
"'asp-route' must not have an 'asp-action' or 'asp-controller' attribute.";
@ -443,8 +445,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act & Assert
var ex = await Assert.ThrowsAsync<InvalidOperationException>(

View File

@ -51,7 +51,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{ "alt", new HtmlString("Testing") },
{ "src", srcOutput },
};
var output = new TagHelperOutput("img", outputAttributes);
var output = new TagHelperOutput(
"img",
outputAttributes,
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var hostingEnvironment = MakeHostingEnvironment();
var viewContext = MakeViewContext();
var urlHelper = new Mock<IUrlHelper>();
@ -273,20 +276,22 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
return new TagHelperContext(
attributes,
items: new Dictionary<object, object>(),
uniqueId: Guid.NewGuid().ToString("N"),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(default(string));
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: Guid.NewGuid().ToString("N"));
}
private static TagHelperOutput MakeImageTagHelperOutput(TagHelperAttributeList attributes)
{
attributes = attributes ?? new TagHelperAttributeList();
return new TagHelperOutput("img", attributes);
return new TagHelperOutput(
"img",
attributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(default(string));
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
}
private static IHostingEnvironment MakeHostingEnvironment()

View File

@ -91,9 +91,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult => Task.FromResult<TagHelperContent>(result: null));
var output = new TagHelperOutput(originalTagName, outputAttributes)
uniqueId: "test");
var output = new TagHelperOutput(
originalTagName,
outputAttributes,
getChildContentAsync: useCachedResult => Task.FromResult<TagHelperContent>(result: null))
{
TagMode = TagMode.SelfClosing,
};
@ -195,18 +197,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.StartTagOnly,
};
@ -257,18 +261,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
originalTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(originalTagName, originalAttributes)
})
{
TagMode = TagMode.SelfClosing,
};
@ -354,18 +360,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var context = new TagHelperContext(
allAttributes: contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.StartTagOnly,
};
@ -453,18 +461,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var context = new TagHelperContext(
allAttributes: contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.StartTagOnly,
};
@ -549,18 +559,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var context = new TagHelperContext(
allAttributes: contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.StartTagOnly,
};
@ -656,18 +668,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var context = new TagHelperContext(
allAttributes: contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var originalAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.StartTagOnly,
};
@ -774,10 +788,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
uniqueId: "test");
var output = new TagHelperOutput(expectedTagName, attributes: new TagHelperAttributeList())
var output = new TagHelperOutput(
expectedTagName,
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()))
{
TagMode = TagMode.SelfClosing,
};
@ -855,10 +871,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
uniqueId: "test");
var output = new TagHelperOutput(expectedTagName, attributes: new TagHelperAttributeList())
var output = new TagHelperOutput(
expectedTagName,
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()))
{
TagMode = TagMode.SelfClosing,
};

View File

@ -128,13 +128,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal
return new TagHelperContext(
attributes,
items: new Dictionary<object, object>(),
uniqueId: Guid.NewGuid().ToString("N"),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.Append(content);
return Task.FromResult((TagHelperContent)tagHelperContent);
});
uniqueId: Guid.NewGuid().ToString("N"));
}
}
}

View File

@ -194,18 +194,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var htmlAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
expectedTagName,
htmlAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.AppendEncoded(tagHelperOutputContent.OriginalChildContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var htmlAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(expectedTagName, htmlAttributes);
output.PreContent.AppendEncoded(expectedPreContent);
output.PostContent.AppendEncoded(expectedPostContent);

View File

@ -831,29 +831,24 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
return viewContext;
}
private static TagHelperContext MakeTagHelperContext(
TagHelperAttributeList attributes = null,
string content = null)
private static TagHelperContext MakeTagHelperContext(TagHelperAttributeList attributes = null)
{
attributes = attributes ?? new TagHelperAttributeList();
return new TagHelperContext(
attributes,
items: new Dictionary<object, object>(),
uniqueId: Guid.NewGuid().ToString("N"),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(content);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: Guid.NewGuid().ToString("N"));
}
private static TagHelperOutput MakeTagHelperOutput(string tagName, TagHelperAttributeList attributes = null)
{
attributes = attributes ?? new TagHelperAttributeList();
return new TagHelperOutput(tagName, attributes);
return new TagHelperOutput(
tagName,
attributes,
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
}
private static IHostingEnvironment MakeHostingEnvironment()

View File

@ -398,15 +398,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var tagHelperContext = new TagHelperContext(
contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagHelperOutput.TagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
// GetChildContentAsync should not be invoked since we are setting the content below.
Assert.True(false);
return Task.FromResult<TagHelperContent>(null);
});
var output = new TagHelperOutput(expectedTagHelperOutput.TagName, originalAttributes)
})
{
TagMode = TagMode.StartTagAndEndTag
};
@ -467,14 +469,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var tagHelperContext = new TagHelperContext(
contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
originalTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(originalContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(originalTagName, originalAttributes)
})
{
TagMode = TagMode.StartTagAndEndTag,
};
@ -528,15 +532,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var tagHelperContext = new TagHelperContext(
contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
originalTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(originalContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(originalTagName, originalAttributes)
})
{
TagMode = TagMode.StartTagAndEndTag,
};
@ -560,7 +566,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
private static TagHelperOutput GetTagHelperOutput(
string tagName, TagHelperAttributeList attributes, string content)
{
var tagHelperOutput = new TagHelperOutput(tagName, attributes);
var tagHelperOutput = new TagHelperOutput(
tagName,
attributes,
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
tagHelperOutput.Content.SetContent(content);
return tagHelperOutput;

View File

@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.ViewFeatures;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.AspNet.Razor.TagHelpers;
using Xunit;
@ -42,19 +43,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
[Theory]
[MemberData(nameof(RenderAtEndOfFormTagHelperData))]
public async Task Process_AddsHiddenInputTag_FromEndOfFormContent(List<TagBuilder> tagBuilderList, string expectedOutput)
public async Task Process_AddsHiddenInputTag_FromEndOfFormContent(
List<TagBuilder> tagBuilderList,
string expectedOutput)
{
// Arrange
var viewContext = new ViewContext();
var tagHelperOutput = new TagHelperOutput(
tagName: "form",
attributes: new TagHelperAttributeList());
var tagHelperContext = new TagHelperContext(
Enumerable.Empty<IReadOnlyTagHelperAttribute>(),
new Dictionary<object, object>(),
"someId",
(useCachedResult) =>
attributes: new TagHelperAttributeList(),
getChildContentAsync: (useCachedResult) =>
{
Assert.True(viewContext.FormContext.CanRenderAtEndOfForm);
foreach (var item in tagBuilderList)
@ -65,10 +63,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
return Task.FromResult<TagHelperContent>(new DefaultTagHelperContent());
});
var tagHelperContext = new TagHelperContext(
Enumerable.Empty<IReadOnlyTagHelperAttribute>(),
new Dictionary<object, object>(),
"someId");
var tagHelper = new RenderAtEndOfFormTagHelper
{
ViewContext = viewContext
};
tagHelper.Init(tagHelperContext);
// Act
await tagHelper.ProcessAsync(context: tagHelperContext, output: tagHelperOutput);
@ -77,6 +81,46 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
Assert.Equal(expectedOutput, tagHelperOutput.PostContent.GetContent());
}
[Theory]
[MemberData(nameof(RenderAtEndOfFormTagHelperData))]
public async Task Process_AddsHiddenInputTag_FromEndOfFormContent_WithCachedBody(
List<TagBuilder> tagBuilderList,
string expectedOutput)
{
// Arrange
var viewContext = new ViewContext();
var runner = new TagHelperRunner();
var tagHelperExecutionContext = new TagHelperExecutionContext(
"form",
TagMode.StartTagAndEndTag,
items: new Dictionary<object, object>(),
uniqueId: string.Empty,
executeChildContentAsync: () =>
{
foreach (var item in tagBuilderList)
{
viewContext.FormContext.EndOfFormContent.Add(item);
}
return Task.FromResult(true);
},
startTagHelperWritingScope: () => { },
endTagHelperWritingScope: () => new DefaultTagHelperContent());
// This TagHelper will pre-execute the child content forcing the body to be cached.
tagHelperExecutionContext.Add(new ChildContentInvoker());
tagHelperExecutionContext.Add(new RenderAtEndOfFormTagHelper
{
ViewContext = viewContext
});
// Act
var output = await runner.RunAsync(tagHelperExecutionContext);
// Assert
Assert.Equal(expectedOutput, output.PostContent.GetContent());
}
private static TagBuilder GetTagBuilder(string tag, string name, string type, string value, TagRenderMode mode)
{
var tagBuilder = new TagBuilder(tag);
@ -87,5 +131,21 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
return tagBuilder;
}
private class ChildContentInvoker : TagHelper
{
public override int Order
{
get
{
return int.MinValue;
}
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
await output.GetChildContentAsync();
}
}
}
}

View File

@ -907,13 +907,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
return new TagHelperContext(
attributes,
items: new Dictionary<object, object>(),
uniqueId: Guid.NewGuid().ToString("N"),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(content);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: Guid.NewGuid().ToString("N"));
}
private static ViewContext MakeViewContext(string requestPathBase = null)
@ -941,7 +935,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
attributes = attributes ?? new TagHelperAttributeList();
return new TagHelperOutput(tagName, attributes);
return new TagHelperOutput(
tagName,
attributes,
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
}
private TagHelperLogger<ScriptTagHelper> CreateLogger()

View File

@ -204,14 +204,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.SelfClosing,
};
@ -291,14 +293,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.AppendEncoded("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.SelfClosing,
};
@ -393,14 +397,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.AppendEncoded("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(expectedTagName, originalAttributes)
})
{
TagMode = TagMode.SelfClosing,
};
@ -479,15 +485,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var tagHelperContext = new TagHelperContext(
contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(expectedTagName, originalAttributes);
var metadataProvider = new EmptyModelMetadataProvider();
string model = null;
var modelExplorer = metadataProvider.GetModelExplorerForType(typeof(string), model);
@ -558,14 +566,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var tagHelperContext = new TagHelperContext(
contextAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
tagName,
originalAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(tagName, originalAttributes);
var metadataProvider = new EmptyModelMetadataProvider();
var modelExplorer = metadataProvider.GetModelExplorerForType(modelType, model);
var modelExpression = new ModelExpression(propertyName, modelExplorer);

View File

@ -334,12 +334,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
IEnumerable<TagHelperAttribute> expectedAttributes)
{
// Arrange
var output = new TagHelperOutput("p", attributes: new TagHelperAttributeList(outputAttributes));
var output = new TagHelperOutput(
tagName: "p",
attributes: new TagHelperAttributeList(outputAttributes),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var context = new TagHelperContext(
allAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult => Task.FromResult<TagHelperContent>(result: null));
uniqueId: "test");
// Act
output.CopyHtmlAttribute(attributeNameToCopy, context);
@ -432,12 +434,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
IEnumerable<TagHelperAttribute> expectedAttributes)
{
// Arrange
var output = new TagHelperOutput("p", attributes: new TagHelperAttributeList());
var output = new TagHelperOutput(
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var context = new TagHelperContext(
allAttributes,
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult => Task.FromResult<TagHelperContent>(result: null));
uniqueId: "test");
// Act
output.CopyHtmlAttribute(attributeNameToCopy, context);
@ -454,20 +458,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
var tagHelperContext = new TagHelperContext(
allAttributes: new TagHelperAttributeList
{
{ attributeName, attributeValue }
},
items: new Dictionary<object, object>(),
uniqueId: "test",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.Append("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var tagHelperContext = new TagHelperContext(
allAttributes: new TagHelperAttributeList
{
{ attributeName, attributeValue }
},
items: new Dictionary<object, object>(),
uniqueId: "test");
var expectedAttribute = new TagHelperAttribute(attributeName, attributeValue);
// Act
@ -488,6 +492,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
attributes: new TagHelperAttributeList()
{
{ attributeName, "world2" }
},
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.Append("Something Else");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var expectedAttribute = new TagHelperAttribute(attributeName, "world2");
var tagHelperContext = new TagHelperContext(
@ -496,13 +506,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{ attributeName, "world" }
},
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.Append("Something Else");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: "test");
// Act
tagHelperOutput.CopyHtmlAttribute(attributeName, tagHelperContext);
@ -519,20 +523,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var invalidAttributeName = "hello2";
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
var tagHelperContext = new TagHelperContext(
allAttributes: new TagHelperAttributeList
{
{ "hello", "world" }
},
items: new Dictionary<object, object>(),
uniqueId: "test",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.Append("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var tagHelperContext = new TagHelperContext(
allAttributes: new TagHelperAttributeList
{
{ "hello", "world" }
},
items: new Dictionary<object, object>(),
uniqueId: "test");
// Act & Assert
ExceptionAssert.ThrowsArgument(
@ -546,12 +550,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
tagName: "p",
attributes: new TagHelperAttributeList()
{
{ "route-Hello", "World" },
{ "Route-I", "Am" }
});
},
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var expectedAttribute = new TagHelperAttribute("type", "btn");
tagHelperOutput.Attributes.Add(expectedAttribute);
@ -572,12 +577,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
tagName: "p",
attributes: new TagHelperAttributeList()
{
{ "route-Hello", "World" },
{ "Route-I", "Am" }
});
},
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var expectedAttribute = new TagHelperAttribute("type", "btn");
tagHelperOutput.Attributes.Add(expectedAttribute);
var attributes = tagHelperOutput.Attributes
@ -596,12 +602,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
tagName: "p",
attributes: new TagHelperAttributeList()
{
{ "route-Hello", "World" },
{ "Route-I", "Am" }
});
},
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var expectedAttribute = new TagHelperAttribute("type", "btn");
tagHelperOutput.Attributes.Add(expectedAttribute);
@ -756,7 +763,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
TagHelperAttributeList expectedAttributes)
{
// Arrange
var tagHelperOutput = new TagHelperOutput("p", outputAttributes);
var tagHelperOutput = new TagHelperOutput(
"p",
outputAttributes,
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var tagBuilder = new TagBuilder("p");
foreach (var attr in tagBuilderAttributes)
@ -779,8 +789,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var expectedAttribute = new TagHelperAttribute("type", "btn");
tagHelperOutput.Attributes.Add(expectedAttribute);
@ -800,8 +811,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
tagHelperOutput.Attributes.Add("class", "Hello");
var tagBuilder = new TagBuilder("p");
@ -826,8 +838,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
tagHelperOutput.Attributes.Add(originalName, "Hello");
var tagBuilder = new TagBuilder("p");
@ -846,8 +859,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var tagBuilder = new TagBuilder("p");
var expectedAttribute = new TagHelperAttribute("visible", "val < 3");
@ -866,8 +880,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var tagBuilder = new TagBuilder("p");
var expectedAttribute1 = new TagHelperAttribute("class", "btn");
@ -891,8 +906,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var expectedAttribute = new TagHelperAttribute("class", "btn");
tagHelperOutput.Attributes.Add(expectedAttribute);
@ -911,8 +927,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
// Arrange
var tagHelperOutput = new TagHelperOutput(
"p",
attributes: new TagHelperAttributeList());
tagName: "p",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
var expectedOutputAttribute = new TagHelperAttribute("class", "btn");
tagHelperOutput.Attributes.Add(expectedOutputAttribute);

View File

@ -128,18 +128,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var htmlAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(
expectedTagName,
htmlAttributes,
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var htmlAttributes = new TagHelperAttributeList
{
{ "class", "form-control" },
};
var output = new TagHelperOutput(expectedTagName, htmlAttributes)
})
{
TagMode = TagMode.SelfClosing,
};

View File

@ -47,18 +47,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{ "for", modelExpression },
},
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
attributes: new TagHelperAttributeList
{
{ "id", "myvalidationmessage" }
},
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
@ -111,16 +111,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
uniqueId: "test");
var output = new TagHelperOutput(
"span",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var output = new TagHelperOutput(
"span",
attributes: new TagHelperAttributeList());
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
output.PostContent.SetContent(expectedPostContent);
@ -167,20 +167,20 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
};
var output = new TagHelperOutput(
"span",
attributes: new TagHelperAttributeList());
output.Content.AppendEncoded(outputContent);
var context = new TagHelperContext(
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.AppendEncoded(childContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
output.Content.AppendEncoded(outputContent);
var context = new TagHelperContext(
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test");
var viewContext = CreateViewContext();
validationMessageTagHelper.ViewContext = viewContext;
@ -226,13 +226,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
};
var output = new TagHelperOutput(
"span",
attributes: new TagHelperAttributeList());
var context = new TagHelperContext(
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
attributes: new TagHelperAttributeList(),
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
@ -240,6 +234,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var context = new TagHelperContext(
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test");
var viewContext = CreateViewContext();
validationMessageTagHelper.ViewContext = viewContext;
@ -266,8 +266,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedContent = "original content";
var expectedPostContent = "original post-content";
var output = new TagHelperOutput(
"span",
attributes: new TagHelperAttributeList());
tagName: "span",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
output.PostContent.SetContent(expectedPostContent);
@ -276,8 +277,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
var viewContext = CreateViewContext();
validationMessageTagHelper.ViewContext = viewContext;

View File

@ -43,18 +43,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
uniqueId: "test");
var output = new TagHelperOutput(
expectedTagName,
attributes: new TagHelperAttributeList
{
{ "class", "form-control" }
},
getChildContentAsync: useCachedResult =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent("Something");
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
@ -110,8 +110,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedContent = "original content";
var expectedPostContent = "original post-content";
var output = new TagHelperOutput(
"div",
attributes: new TagHelperAttributeList());
tagName: "div",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
output.PostContent.SetContent(expectedPostContent);
@ -122,8 +123,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act & Assert
await validationSummaryTagHelper.ProcessAsync(context, output);
@ -164,8 +164,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedPreContent = "original pre-content";
var expectedContent = "original content";
var output = new TagHelperOutput(
"div",
attributes: new TagHelperAttributeList());
tagName: "div",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
output.PostContent.SetContent("Content of validation summary");
@ -177,8 +178,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act
await validationSummaryTagHelper.ProcessAsync(context, output);
@ -212,8 +212,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedContent = "original content";
var expectedPostContent = "original post-content";
var output = new TagHelperOutput(
"div",
attributes: new TagHelperAttributeList());
tagName: "div",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
output.PostContent.SetContent(expectedPostContent);
@ -225,8 +226,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act
await validationSummaryTagHelper.ProcessAsync(context, output);
@ -267,8 +267,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedPreContent = "original pre-content";
var expectedContent = "original content";
var output = new TagHelperOutput(
"div",
attributes: new TagHelperAttributeList());
tagName: "div",
attributes: new TagHelperAttributeList(),
getChildContentAsync: (_) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
output.PreContent.SetContent(expectedPreContent);
output.Content.SetContent(expectedContent);
output.PostContent.SetContent("Content of validation message");
@ -280,8 +281,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
allAttributes: new ReadOnlyTagHelperAttributeList<IReadOnlyTagHelperAttribute>(
Enumerable.Empty<IReadOnlyTagHelperAttribute>()),
items: new Dictionary<object, object>(),
uniqueId: "test",
getChildContentAsync: _ => Task.FromResult<TagHelperContent>(null));
uniqueId: "test");
// Act
await validationSummaryTagHelper.ProcessAsync(context, output);

View File

@ -33,7 +33,7 @@ namespace ActivatorWebSite.TagHelpers
{
(HtmlHelper as ICanHasViewContext)?.Contextualize(ViewContext);
var content = await context.GetChildContentAsync();
var content = await output.GetChildContentAsync();
output.Content.SetContent(HtmlHelper.Hidden(Name, content.GetContent(HtmlEncoder)));
}
}

View File

@ -31,7 +31,7 @@ namespace ActivatorWebSite.TagHelpers
{
(HtmlHelper as ICanHasViewContext)?.Contextualize(ViewContext);
var content = await context.GetChildContentAsync();
var content = await output.GetChildContentAsync();
var repeatContent = HtmlHelper.Encode(Expression.Model.ToString());
if (string.IsNullOrEmpty(repeatContent))

View File

@ -12,7 +12,7 @@ namespace TagHelpersWebSite.TagHelpers
{
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
var childContent = await context.GetChildContentAsync();
var childContent = await output.GetChildContentAsync();
// Find Urls in the content and replace them with their anchor tag equivalent.
output.Content.AppendEncoded(Regex.Replace(

View File

@ -33,6 +33,10 @@ namespace MvcSample.Web.Components
public int Order { get; } = 0;
public void Init(TagHelperContext context)
{
}
public async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
var result = await InvokeAsync(Count);