ValidationContext MemberName等于DisplayName

时间:2015-11-18 18:43:33

标签: c# asp.net-web-api

我创建了一个自定义验证属性,如下所示:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class MandatoryAttribute : RequiredAttribute
{
    public string DisplayName { get; private set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var memberName = validationContext.MemberName;

        DisplayName = AttributeFunctions.GetDisplayName(validationContext);

        return base.IsValid(value, validationContext);
    }

    public override string FormatErrorMessage(string name)
    {
        return AttributeFunctions.HasValidErrorMessageResource(this) ? base.FormatErrorMessage(DisplayName) : String.Format(Global.MandatoryValidationMessage, DisplayName);
    }
}

我的模型看起来像这样:

public class Model
{
    [Mandatory]
    [Display(Name = "ResourceName", ResourceType = typeof(Resources.Global))]
    public string SomeProperty { get; set; }
}

出于某种原因,MemberName的{​​{1}}将始终等于我在ValidationContext属性中放置的内容。如果我对Display属性发表评论,那么Display就像我期望的那样等于MemberName

这是正常行为吗? "SomeProperty"不应该始终等于MemberName属性吗?

我说这是因为我需要从验证上下文中检索PropertyInfo.Name,如果PropertyInfo没有给我正确的值,我就无法做到。

1 个答案:

答案 0 :(得分:0)

我有同样的问题 这是一个来自webapi的bug,在mvc中运行正常

带有bug的webapi源代码中的类 https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Http/Validation/Validators/DataAnnotationsModelValidator.cs

mvc 5中的工人阶级 https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/DataAnnotationsModelValidator.cs

我会尝试覆盖这个,如果工作我会更新这篇文章