ValidationSummary doesn't display property errors if ModelState and ModelMetadata meets the specific conditions #4831
Hi @dougbu I removed test which is naming conflicts. and closing #7221 PR
This commit is contained in:
parent
e465013063
commit
c1ce7b9a77
|
|
@ -93,15 +93,17 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
|
|||
Visit(indexEntry, metadata.ElementMetadata, orderedModelStateEntries);
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < metadata.Properties.Count; i++)
|
||||
else
|
||||
{
|
||||
var propertyMetadata = metadata.Properties[i];
|
||||
var propertyModelStateEntry = modelStateEntry.GetModelStateForProperty(propertyMetadata.PropertyName);
|
||||
if (propertyModelStateEntry != null)
|
||||
for (var i = 0; i < metadata.Properties.Count; i++)
|
||||
{
|
||||
Visit(propertyModelStateEntry, propertyMetadata, orderedModelStateEntries);
|
||||
}
|
||||
var propertyMetadata = metadata.Properties[i];
|
||||
var propertyModelStateEntry = modelStateEntry.GetModelStateForProperty(propertyMetadata.PropertyName);
|
||||
if (propertyModelStateEntry != null)
|
||||
{
|
||||
Visit(propertyModelStateEntry, propertyMetadata, orderedModelStateEntries);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!modelStateEntry.IsContainerNode)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
|
@ -587,6 +588,67 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
expectedMessage);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ProcessAsync_GeneratesExpectedOutput_WithModelErrorForIEnumerable()
|
||||
{
|
||||
// Arrange
|
||||
var expectedError = "Something went wrong.";
|
||||
var expectedTagName = "not-div";
|
||||
var expectedAttributes = new TagHelperAttributeList
|
||||
{
|
||||
new TagHelperAttribute("class", "form-control validation-summary-errors"),
|
||||
new TagHelperAttribute("data-valmsg-summary", "true"),
|
||||
};
|
||||
|
||||
var metadataProvider = new TestModelMetadataProvider();
|
||||
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
|
||||
var validationSummaryTagHelper = new ValidationSummaryTagHelper(htmlGenerator)
|
||||
{
|
||||
ValidationSummary = ValidationSummary.All,
|
||||
};
|
||||
|
||||
var expectedPreContent = "original pre-content";
|
||||
var expectedContent = "original content";
|
||||
var tagHelperContext = new TagHelperContext(
|
||||
tagName: "not-div",
|
||||
allAttributes: new TagHelperAttributeList(),
|
||||
items: new Dictionary<object, object>(),
|
||||
uniqueId: "test");
|
||||
var output = new TagHelperOutput(
|
||||
expectedTagName,
|
||||
attributes: new TagHelperAttributeList
|
||||
{
|
||||
{ "class", "form-control" }
|
||||
},
|
||||
getChildContentAsync: (useCachedResult, encoder) =>
|
||||
{
|
||||
var tagHelperContent = new DefaultTagHelperContent();
|
||||
tagHelperContent.SetContent("Something");
|
||||
return Task.FromResult<TagHelperContent>(tagHelperContent);
|
||||
});
|
||||
output.PreContent.SetContent(expectedPreContent);
|
||||
output.Content.SetContent(expectedContent);
|
||||
output.PostContent.SetContent("Custom Content");
|
||||
|
||||
var model = new FormMetadata();
|
||||
var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider);
|
||||
validationSummaryTagHelper.ViewContext = viewContext;
|
||||
|
||||
viewContext.ModelState.AddModelError(key: nameof(FormMetadata.ID), errorMessage: expectedError);
|
||||
|
||||
// Act
|
||||
await validationSummaryTagHelper.ProcessAsync(tagHelperContext, output);
|
||||
|
||||
// Assert
|
||||
Assert.Equal(expectedAttributes, output.Attributes, CaseSensitiveTagHelperAttributeComparer.Default);
|
||||
Assert.Equal(expectedPreContent, output.PreContent.GetContent());
|
||||
Assert.Equal(expectedContent, output.Content.GetContent());
|
||||
Assert.Equal(
|
||||
$"Custom Content<ul><li>{expectedError}</li>{Environment.NewLine}</ul>",
|
||||
output.PostContent.GetContent());
|
||||
Assert.Equal(expectedTagName, output.TagName);
|
||||
}
|
||||
|
||||
private static ViewContext CreateViewContext()
|
||||
{
|
||||
var actionContext = new ActionContext(
|
||||
|
|
@ -629,5 +691,22 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
|||
// but no element does.
|
||||
public byte[] Empty { get; set; }
|
||||
}
|
||||
|
||||
private class FormMetadata : IEnumerable<Model>
|
||||
{
|
||||
private List<Model> _fields = new List<Model>();
|
||||
|
||||
public int ID { get; set; }
|
||||
|
||||
public IEnumerator<Model> GetEnumerator()
|
||||
{
|
||||
return _fields.GetEnumerator();
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return _fields.GetEnumerator();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue