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,14 +93,16 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
|
||||||
Visit(indexEntry, metadata.ElementMetadata, orderedModelStateEntries);
|
Visit(indexEntry, metadata.ElementMetadata, orderedModelStateEntries);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
for (var i = 0; i < metadata.Properties.Count; i++)
|
|
||||||
{
|
{
|
||||||
var propertyMetadata = metadata.Properties[i];
|
for (var i = 0; i < metadata.Properties.Count; i++)
|
||||||
var propertyModelStateEntry = modelStateEntry.GetModelStateForProperty(propertyMetadata.PropertyName);
|
|
||||||
if (propertyModelStateEntry != null)
|
|
||||||
{
|
{
|
||||||
Visit(propertyModelStateEntry, propertyMetadata, orderedModelStateEntries);
|
var propertyMetadata = metadata.Properties[i];
|
||||||
|
var propertyModelStateEntry = modelStateEntry.GetModelStateForProperty(propertyMetadata.PropertyName);
|
||||||
|
if (propertyModelStateEntry != null)
|
||||||
|
{
|
||||||
|
Visit(propertyModelStateEntry, propertyMetadata, orderedModelStateEntries);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
@ -587,6 +588,67 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
expectedMessage);
|
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()
|
private static ViewContext CreateViewContext()
|
||||||
{
|
{
|
||||||
var actionContext = new ActionContext(
|
var actionContext = new ActionContext(
|
||||||
|
|
@ -629,5 +691,22 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
// but no element does.
|
// but no element does.
|
||||||
public byte[] Empty { get; set; }
|
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