DisplayMetadata use DisplayNameAttribute
This commit is contained in:
parent
f222fa4349
commit
6cdd0451da
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
@ -66,6 +67,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations.Internal
|
||||||
var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
|
var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
|
||||||
var displayColumnAttribute = attributes.OfType<DisplayColumnAttribute>().FirstOrDefault();
|
var displayColumnAttribute = attributes.OfType<DisplayColumnAttribute>().FirstOrDefault();
|
||||||
var displayFormatAttribute = attributes.OfType<DisplayFormatAttribute>().FirstOrDefault();
|
var displayFormatAttribute = attributes.OfType<DisplayFormatAttribute>().FirstOrDefault();
|
||||||
|
var displayNameAttribute = attributes.OfType<DisplayNameAttribute>().FirstOrDefault();
|
||||||
var hiddenInputAttribute = attributes.OfType<HiddenInputAttribute>().FirstOrDefault();
|
var hiddenInputAttribute = attributes.OfType<HiddenInputAttribute>().FirstOrDefault();
|
||||||
var scaffoldColumnAttribute = attributes.OfType<ScaffoldColumnAttribute>().FirstOrDefault();
|
var scaffoldColumnAttribute = attributes.OfType<ScaffoldColumnAttribute>().FirstOrDefault();
|
||||||
var uiHintAttribute = attributes.OfType<UIHintAttribute>().FirstOrDefault();
|
var uiHintAttribute = attributes.OfType<UIHintAttribute>().FirstOrDefault();
|
||||||
|
|
@ -127,7 +129,8 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations.Internal
|
||||||
}
|
}
|
||||||
|
|
||||||
// DisplayName
|
// DisplayName
|
||||||
if (displayAttribute != null)
|
// DisplayAttribute has precendence over DisplayNameAttribute.
|
||||||
|
if (displayAttribute != null && displayAttribute.GetName() != null)
|
||||||
{
|
{
|
||||||
if (localizer != null &&
|
if (localizer != null &&
|
||||||
!string.IsNullOrEmpty(displayAttribute.Name) &&
|
!string.IsNullOrEmpty(displayAttribute.Name) &&
|
||||||
|
|
@ -140,6 +143,18 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations.Internal
|
||||||
displayMetadata.DisplayName = () => displayAttribute.GetName();
|
displayMetadata.DisplayName = () => displayAttribute.GetName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (displayNameAttribute != null)
|
||||||
|
{
|
||||||
|
if (localizer != null &&
|
||||||
|
!string.IsNullOrEmpty(displayNameAttribute.DisplayName))
|
||||||
|
{
|
||||||
|
displayMetadata.DisplayName = () => localizer[displayNameAttribute.DisplayName];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
displayMetadata.DisplayName = () => displayNameAttribute.DisplayName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// EditFormatString
|
// EditFormatString
|
||||||
if (displayFormatAttribute != null && displayFormatAttribute.ApplyFormatInEditMode)
|
if (displayFormatAttribute != null && displayFormatAttribute.ApplyFormatInEditMode)
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
|
@ -44,6 +45,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations.Internal
|
||||||
{ new DisplayFormatAttribute() { HtmlEncode = false }, d => d.HtmlEncode, false },
|
{ new DisplayFormatAttribute() { HtmlEncode = false }, d => d.HtmlEncode, false },
|
||||||
{ new DisplayFormatAttribute() { NullDisplayText = "(null)" }, d => d.NullDisplayText, "(null)" },
|
{ new DisplayFormatAttribute() { NullDisplayText = "(null)" }, d => d.NullDisplayText, "(null)" },
|
||||||
|
|
||||||
|
{ new DisplayNameAttribute("DisplayNameValue"), d => d.DisplayName(), "DisplayNameValue"},
|
||||||
{ new HiddenInputAttribute() { DisplayValue = false }, d => d.HideSurroundingHtml, true },
|
{ new HiddenInputAttribute() { DisplayValue = false }, d => d.HideSurroundingHtml, true },
|
||||||
|
|
||||||
{ new ScaffoldColumnAttribute(scaffold: false), d => d.ShowForDisplay, false },
|
{ new ScaffoldColumnAttribute(scaffold: false), d => d.ShowForDisplay, false },
|
||||||
|
|
@ -166,6 +168,124 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations.Internal
|
||||||
Assert.False(context.BindingMetadata.IsReadOnly);
|
Assert.False(context.BindingMetadata.IsReadOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateDisplayMetadata_DisplayAttribute_OverridesDisplayNameAttribute()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var localizationOptions = new TestOptionsManager<MvcDataAnnotationsLocalizationOptions>();
|
||||||
|
|
||||||
|
var provider = new DataAnnotationsMetadataProvider(
|
||||||
|
localizationOptions,
|
||||||
|
stringLocalizerFactory: null);
|
||||||
|
|
||||||
|
var displayName = new DisplayNameAttribute("DisplayNameAttributeValue");
|
||||||
|
var display = new DisplayAttribute()
|
||||||
|
{
|
||||||
|
Name = "DisplayAttributeValue"
|
||||||
|
};
|
||||||
|
|
||||||
|
var attributes = new Attribute[] { display, displayName };
|
||||||
|
var key = ModelMetadataIdentity.ForType(typeof(string));
|
||||||
|
var context = new DisplayMetadataProviderContext(key, new ModelAttributes(attributes));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
provider.CreateDisplayMetadata(context);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("DisplayAttributeValue", context.DisplayMetadata.DisplayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateDisplayMetadata_DisplayAttribute_OverridesDisplayNameAttribute_IfNameEmpty()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var localizationOptions = new TestOptionsManager<MvcDataAnnotationsLocalizationOptions>();
|
||||||
|
|
||||||
|
var provider = new DataAnnotationsMetadataProvider(
|
||||||
|
localizationOptions,
|
||||||
|
stringLocalizerFactory: null);
|
||||||
|
|
||||||
|
var displayName = new DisplayNameAttribute("DisplayNameAttributeValue");
|
||||||
|
var display = new DisplayAttribute()
|
||||||
|
{
|
||||||
|
Name = string.Empty
|
||||||
|
};
|
||||||
|
|
||||||
|
var attributes = new Attribute[] { display, displayName };
|
||||||
|
var key = ModelMetadataIdentity.ForType(typeof(string));
|
||||||
|
var context = new DisplayMetadataProviderContext(key, new ModelAttributes(attributes));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
provider.CreateDisplayMetadata(context);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(string.Empty, context.DisplayMetadata.DisplayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateDisplayMetadata_DisplayAttribute_DoesNotOverrideDisplayNameAttribute_IfNameNull()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var localizationOptions = new TestOptionsManager<MvcDataAnnotationsLocalizationOptions>();
|
||||||
|
|
||||||
|
var provider = new DataAnnotationsMetadataProvider(
|
||||||
|
localizationOptions,
|
||||||
|
stringLocalizerFactory: null);
|
||||||
|
|
||||||
|
var displayName = new DisplayNameAttribute("DisplayNameAttributeValue");
|
||||||
|
var display = new DisplayAttribute()
|
||||||
|
{
|
||||||
|
Description = "This is a description"
|
||||||
|
};
|
||||||
|
|
||||||
|
var attributes = new Attribute[] { display, displayName };
|
||||||
|
var key = ModelMetadataIdentity.ForType(typeof(string));
|
||||||
|
var context = new DisplayMetadataProviderContext(key, new ModelAttributes(attributes));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
provider.CreateDisplayMetadata(context);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("DisplayNameAttributeValue", context.DisplayMetadata.DisplayName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CreateDisplayMetadata_DisplayNameAttribute_LocalizesDisplayName()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var sharedLocalizer = new Mock<IStringLocalizer>(MockBehavior.Strict);
|
||||||
|
sharedLocalizer
|
||||||
|
.Setup(s => s["DisplayNameValue"])
|
||||||
|
.Returns(new LocalizedString("DisplayNameValue", "Name from DisplayNameAttribute"));
|
||||||
|
|
||||||
|
var stringLocalizerFactoryMock = new Mock<IStringLocalizerFactory>(MockBehavior.Strict);
|
||||||
|
stringLocalizerFactoryMock
|
||||||
|
.Setup(s => s.Create(typeof(EmptyClass)))
|
||||||
|
.Returns(() => sharedLocalizer.Object);
|
||||||
|
|
||||||
|
var localizationOptions = new TestOptionsManager<MvcDataAnnotationsLocalizationOptions>();
|
||||||
|
localizationOptions.Value.DataAnnotationLocalizerProvider = (type, stringLocalizerFactory) =>
|
||||||
|
{
|
||||||
|
return stringLocalizerFactory.Create(typeof(EmptyClass));
|
||||||
|
};
|
||||||
|
|
||||||
|
var provider = new DataAnnotationsMetadataProvider(
|
||||||
|
localizationOptions,
|
||||||
|
stringLocalizerFactory: stringLocalizerFactoryMock.Object);
|
||||||
|
|
||||||
|
var displayName = new DisplayNameAttribute("DisplayNameValue");
|
||||||
|
|
||||||
|
var attributes = new Attribute[] { displayName };
|
||||||
|
var key = ModelMetadataIdentity.ForType(typeof(string));
|
||||||
|
var context = new DisplayMetadataProviderContext(key, new ModelAttributes(attributes));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
provider.CreateDisplayMetadata(context);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal("Name from DisplayNameAttribute", context.DisplayMetadata.DisplayName());
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void CreateDisplayMetadata_DisplayAttribute_NameFromResources_UsesDataAnnotationLocalizerProvider()
|
public void CreateDisplayMetadata_DisplayAttribute_NameFromResources_UsesDataAnnotationLocalizerProvider()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue