Skip to content

Commit

Permalink
DisplayMetadata use DisplayNameAttribute
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanbrandenburg committed Sep 27, 2016
1 parent f222fa4 commit 6cdd045
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
Expand Down Expand Up @@ -66,6 +67,7 @@ public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault();
var displayColumnAttribute = attributes.OfType<DisplayColumnAttribute>().FirstOrDefault();
var displayFormatAttribute = attributes.OfType<DisplayFormatAttribute>().FirstOrDefault();
var displayNameAttribute = attributes.OfType<DisplayNameAttribute>().FirstOrDefault();
var hiddenInputAttribute = attributes.OfType<HiddenInputAttribute>().FirstOrDefault();
var scaffoldColumnAttribute = attributes.OfType<ScaffoldColumnAttribute>().FirstOrDefault();
var uiHintAttribute = attributes.OfType<UIHintAttribute>().FirstOrDefault();
Expand Down Expand Up @@ -127,7 +129,8 @@ public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
}

// DisplayName
if (displayAttribute != null)
// DisplayAttribute has precendence over DisplayNameAttribute.
if (displayAttribute != null && displayAttribute.GetName() != null)
{
if (localizer != null &&
!string.IsNullOrEmpty(displayAttribute.Name) &&
Expand All @@ -140,6 +143,18 @@ public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
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
if (displayFormatAttribute != null && displayFormatAttribute.ApplyFormatInEditMode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Microsoft.AspNetCore.Mvc.ModelBinding;
Expand Down Expand Up @@ -44,6 +45,7 @@ public static TheoryData<object, Func<DisplayMetadata, object>, object> DisplayD
{ new DisplayFormatAttribute() { HtmlEncode = false }, d => d.HtmlEncode, false },
{ new DisplayFormatAttribute() { NullDisplayText = "(null)" }, d => d.NullDisplayText, "(null)" },

{ new DisplayNameAttribute("DisplayNameValue"), d => d.DisplayName(), "DisplayNameValue"},
{ new HiddenInputAttribute() { DisplayValue = false }, d => d.HideSurroundingHtml, true },

{ new ScaffoldColumnAttribute(scaffold: false), d => d.ShowForDisplay, false },
Expand Down Expand Up @@ -166,6 +168,124 @@ public void CreateBindingMetadata_EditableAttributeTrue_SetsReadOnlyFalse()
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]
public void CreateDisplayMetadata_DisplayAttribute_NameFromResources_UsesDataAnnotationLocalizerProvider()
{
Expand Down

0 comments on commit 6cdd045

Please sign in to comment.