Print a useful error message when render-mode isn't specified (#15410)
* Print a useful error message when render-mode isn't specified
This commit is contained in:
commit
1361b0e5d6
|
|
@ -114,7 +114,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNameAttribute("params", DictionaryAttributePrefix="param-")]
|
||||
public System.Collections.Generic.IDictionary<string, object> Parameters { get { throw null; } set { } }
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNameAttribute("render-mode")]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.RenderMode RenderMode { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.RenderMode RenderMode { get { throw null; } set { } }
|
||||
[Microsoft.AspNetCore.Mvc.ViewFeatures.ViewContextAttribute]
|
||||
[Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeNotBoundAttribute]
|
||||
public Microsoft.AspNetCore.Mvc.Rendering.ViewContext ViewContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||
|
|
|
|||
|
|
@ -14,14 +14,16 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
/// <summary>
|
||||
/// A <see cref="TagHelper"/> that renders a Razor component.
|
||||
/// </summary>
|
||||
[HtmlTargetElement("component", Attributes = ComponentTypeName, TagStructure = TagStructure.WithoutEndTag)]
|
||||
[HtmlTargetElement(TagHelperName, Attributes = ComponentTypeName, TagStructure = TagStructure.WithoutEndTag)]
|
||||
public sealed class ComponentTagHelper : TagHelper
|
||||
{
|
||||
private const string TagHelperName = "component";
|
||||
private const string ComponentParameterName = "params";
|
||||
private const string ComponentParameterPrefix = "param-";
|
||||
private const string ComponentTypeName = "type";
|
||||
private const string RenderModeName = "render-mode";
|
||||
private IDictionary<string, object> _parameters;
|
||||
private RenderMode? _renderMode;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the <see cref="Rendering.ViewContext"/> for the current request.
|
||||
|
|
@ -54,7 +56,29 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
/// Gets or sets the <see cref="Rendering.RenderMode"/>
|
||||
/// </summary>
|
||||
[HtmlAttributeName(RenderModeName)]
|
||||
public RenderMode RenderMode { get; set; }
|
||||
public RenderMode RenderMode
|
||||
{
|
||||
get => _renderMode ?? default;
|
||||
set
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case RenderMode.Server:
|
||||
case RenderMode.ServerPrerendered:
|
||||
case RenderMode.Static:
|
||||
_renderMode = value;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new ArgumentException(
|
||||
message: Resources.FormatInvalidEnumArgument(
|
||||
nameof(value),
|
||||
value,
|
||||
typeof(RenderMode).FullName),
|
||||
paramName: nameof(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
|
||||
|
|
@ -69,6 +93,11 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
throw new ArgumentNullException(nameof(output));
|
||||
}
|
||||
|
||||
if (_renderMode is null)
|
||||
{
|
||||
throw new ArgumentException(Resources.FormatAttributeIsRequired(RenderModeName, TagHelperName), nameof(RenderMode));
|
||||
}
|
||||
|
||||
var componentRenderer = ViewContext.HttpContext.RequestServices.GetRequiredService<IComponentRenderer>();
|
||||
var result = await componentRenderer.RenderComponentAsync(ViewContext, ComponentType, RenderMode, _parameters);
|
||||
|
||||
|
|
|
|||
|
|
@ -162,4 +162,7 @@
|
|||
<data name="ViewEngine_FallbackViewNotFound" xml:space="preserve">
|
||||
<value>The fallback partial view '{0}' was not found. The following locations were searched:{1}</value>
|
||||
</data>
|
||||
<data name="AttributeIsRequired" xml:space="preserve">
|
||||
<value>A value for the '{0}' attribute must be supplied to the '{1}' tag helper.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -3,13 +3,13 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Pipes;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Html;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||
using Microsoft.AspNetCore.Testing;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
|
@ -25,6 +25,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
var tagHelper = new ComponentTagHelper
|
||||
{
|
||||
ViewContext = GetViewContext(),
|
||||
RenderMode = RenderMode.Static,
|
||||
};
|
||||
var context = GetTagHelperContext();
|
||||
var output = GetTagHelperOutput();
|
||||
|
|
@ -38,6 +39,24 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
Assert.Null(output.TagName);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ProcessAsync_WithoutSpecifyingRenderMode_ThrowsError()
|
||||
{
|
||||
// Arrange
|
||||
var tagHelper = new ComponentTagHelper
|
||||
{
|
||||
ViewContext = GetViewContext(),
|
||||
};
|
||||
var context = GetTagHelperContext();
|
||||
var output = GetTagHelperOutput();
|
||||
|
||||
// Act & Assert
|
||||
await ExceptionAssert.ThrowsArgumentAsync(
|
||||
() => tagHelper.ProcessAsync(context, output),
|
||||
nameof(RenderMode),
|
||||
"A value for the 'render-mode' attribute must be supplied to the 'component' tag helper.");
|
||||
}
|
||||
|
||||
private static TagHelperContext GetTagHelperContext()
|
||||
{
|
||||
return new TagHelperContext(
|
||||
|
|
|
|||
Loading…
Reference in New Issue