Напротив [сравнить ("")] аннотации данных в .net? - PullRequest
14 голосов
/ 09 января 2012

Что является противоположностью / отрицанием [Compare(" ")] аннотации данных "в ASP.NET?

Т.е.: два свойства должны содержать разные значения.

public string UserName { get; set; }

[Something["UserName"]]
public string Password { get; set; }

Ответы [ 5 ]

8 голосов
/ 21 июля 2013

Вы можете использовать [NotEqualTo] оператор аннотации данных, включенный в Проверка правильности MVC . Я использовал его прямо сейчас, и он прекрасно работает!

MVC Foolproof - это библиотека с открытым исходным кодом, созданная @ nick-riggs и имеющая множество доступных валидаторов. Помимо выполнения проверки на стороне сервера, она также выполняет ненавязчивую проверку на стороне клиента.

Полный список встроенных валидаторов, которые вы получаете из коробки:

Включенные валидаторы оператора

[Is]
[EqualTo]
[NotEqualTo]
[GreaterThan]
[LessThan]
[GreaterThanOrEqualTo]
[LessThanOrEqualTo]

Включены обязательные валидаторы

[RequiredIf]
[RequiredIfNot]
[RequiredIfTrue]
[RequiredIfFalse]
[RequiredIfEmpty]
[RequiredIfNotEmpty]
[RequiredIfRegExMatch]
[RequiredIfNotRegExMatch]

Примечание: если вы планируете использовать MVC Foolproof lib и поддержку Локализация , убедитесь, что вы применили патч Я предоставил здесь: https://foolproof.codeplex.com/SourceControl/list/patches

7 голосов
/ 04 февраля 2016

Это реализация (на стороне сервера) ссылки, на которую ссылается @ Sverker84.

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class UnlikeAttribute : ValidationAttribute
{
    private const string DefaultErrorMessage = "The value of {0} cannot be the same as the value of the {1}.";

    public string OtherProperty { get; private set; }

    public UnlikeAttribute(string otherProperty)
        : base(DefaultErrorMessage)
    {
        if (string.IsNullOrEmpty(otherProperty))
        {
            throw new ArgumentNullException("otherProperty");
        }

        OtherProperty = otherProperty;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name, OtherProperty);
    }

    protected override ValidationResult IsValid(object value,
        ValidationContext validationContext)
    {
        if (value != null)
        {
            var otherProperty = validationContext.ObjectInstance.GetType()
                .GetProperty(OtherProperty);

            var otherPropertyValue = otherProperty
                .GetValue(validationContext.ObjectInstance, null);

            if (value.Equals(otherPropertyValue))
            {
                return new ValidationResult(
                    FormatErrorMessage(validationContext.DisplayName));
            }
        }

        return ValidationResult.Success;
    }
}

Использование:

public string UserName { get; set; }

[Unlike("UserName")]
public string AlternateId { get; set; } 

Подробная информация об этой реализации и способ ее реализации.со стороны клиента можно найти здесь:

http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2

http://www.macaalay.com/2014/02/25/unobtrusive-client-and-server-side-not-equal-to-validation-in-mvc-using-custom-data-annotations/

1 голос
/ 09 июля 2015

Используйте это в логике получения / установки:

stringA.Equals (stringB) == false

0 голосов
/ 27 сентября 2018

Полный код для проверки как на стороне сервера, так и на стороне клиента выглядит следующим образом:

[AttributeUsage(AttributeTargets.Property)]
public class UnlikeAttribute : ValidationAttribute, IClientModelValidator
{

    private string DependentProperty { get; }

    public UnlikeAttribute(string dependentProperty)
    {
        if (string.IsNullOrEmpty(dependentProperty))
        {
            throw new ArgumentNullException(nameof(dependentProperty));
        }
        DependentProperty = dependentProperty;
    }

    protected override ValidationResult IsValid(object value,
        ValidationContext validationContext)
    {
        if (value != null)
        {
            var otherProperty = validationContext.ObjectInstance.GetType().GetProperty(DependentProperty);
            var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance, null);
            if (value.Equals(otherPropertyValue))
            {
                return new ValidationResult(ErrorMessage = ErrorMessage);
            }
        }
        return ValidationResult.Success;
    }

    public void AddValidation(ClientModelValidationContext context)
    {
        MergeAttribute(context.Attributes, "data-val", "true");
        MergeAttribute(context.Attributes, "data-val-unlike", ErrorMessage);
        MergeAttribute(context.Attributes, "data-val-unlike-property", DependentProperty);
    }

    private void MergeAttribute(IDictionary<string, string> attributes,
        string key,
        string value)
    {
        if (attributes.ContainsKey(key))
        {
            return;
        }
        attributes.Add(key, value);
    }
}

Затем включите в JavaScript следующее:

$.validator.addMethod('unlike',
function (value, element, params) {
    var propertyValue = $(params[0]).val();
    var dependentPropertyValue = $(params[1]).val();
    return propertyValue !== dependentPropertyValue;
});

$.validator.unobtrusive.adapters.add('unlike',
['property'],
function (options) {
    var element = $(options.form).find('#' + options.params['property'])[0];
    options.rules['unlike'] = [element, options.element];
    options.messages['unlike'] = options.message;
});

Использованиевыглядит следующим образом:

    public int FromId { get; set; }

    [Unlike(nameof(FromId), ErrorMessage = "From ID and To ID cannot be the same")]
    public int ToId { get; set; }
0 голосов
/ 25 мая 2016

В дополнение к решению, данному @Eitan K, если вы хотите использовать отображаемое имя другого свойства вместо имя другого свойства , используйте этот фрагмент:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public class UnlikeAttribute : ValidationAttribute
    {
        private const string DefaultErrorMessage = "The value of {0} cannot be the same as the value of the {1}.";

        public string OtherPropertyDisplayName { get; private set; }
        public string OtherProperty { get; private set; }

        public UnlikeAttribute(string otherProperty)
            : base(DefaultErrorMessage)
        {
            if (string.IsNullOrEmpty(otherProperty))
            {
                throw new ArgumentNullException("otherProperty");
            }

            OtherProperty = otherProperty;
        }

        public override string FormatErrorMessage(string name)
        {
            return string.Format(ErrorMessageString, name, OtherPropertyDisplayName);
        }

        protected override ValidationResult IsValid(object value,
            ValidationContext validationContext)
        {
            if (value != null)
            {
                var otherProperty = validationContext.ObjectInstance.GetType()
                    .GetProperty(OtherProperty);

                var otherPropertyValue = otherProperty
                    .GetValue(validationContext.ObjectInstance, null);

                if (value.Equals(otherPropertyValue))
                {
                    OtherPropertyDisplayName = otherProperty.GetCustomAttribute<DisplayAttribute>().Name;
                    return new ValidationResult(
                        FormatErrorMessage(validationContext.DisplayName));
                }
            }

            return ValidationResult.Success;
        }

    }
...