MVC 3 - Сравнить атрибут - Выполнить сравнение без учета регистра на стороне клиента - PullRequest
7 голосов
/ 02 апреля 2012

На странице, которую я разрабатываю, у меня есть поле "Электронная почта" и поле "ConfirmEmail". И требование заключается в проведении сравнения без учета регистра.

Я мог бы создать собственный атрибут и расширить поведение встроенного атрибута «Сравнить». Это работает на стороне сервера.

Но я не смог добиться этого на стороне клиента. Я уверен, что нам нужно сделать несколько дополнительных вещей, чтобы сделать ненавязчивый jquery для сравнения без учета регистра.

Ответы [ 4 ]

2 голосов
/ 02 апреля 2012

Вы можете использовать атрибут сравнения в MVC 3 ... который является встроенным решением ...

    [Compare("Email",ErrorMessage="your error message")]
    public string ConfirmEmail { get; set; }

Обновление: мой плохой, вероятно, я должен был прочитать ваш вопрослучше ... в любом случае ... для ненавязчивого способа работы, после создания атрибута (переопределенная версия Compare) ... вам нужно выполнить некоторую работу javascript для работы ненавязчивой проверки на стороне клиента ... вотпример сообщения в блоге ненавязчивая проверка на стороне клиента с помощью MVC 3 ... которая делает нечто похожее на то, о чем я говорю ... если вам нужна дополнительная помощь ... просто отзовитесь ... я будурад помочь вам с этим ...

Вот более релевантный пост ..., в котором также говорится о создании пользовательского атрибута ... Создание пользовательского атрибута проверки (на стороне сервера и на стороне клиента)

Надеюсь, это поможет ...

1 голос
/ 03 апреля 2012

Я не совсем уверен, что вы ищете для атрибута Compare, но для JavaScript это сделает сравнение, и вы можете предпринять действия от клиента на основе результатов.

if (email.toUpperCase() == confirmEmail.toUpperCase()) {
    alert("Emails are a match!");        
} else {
    alert("Emails do not match");
}
0 голосов
/ 21 октября 2015

Чтобы выполнить сравнение без учета регистра, вы можете создать свой собственный валидатор сравнения. Вы закончите с этим.

    public string Courriel { get; set; }

    [EqualToIgnoreCase("Courriel", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "E00007")]
    public string CourrielConfirmation { get; set;}

Это атрибут валидации:

/// <summary>
/// The equal to ignore case.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class EqualToIgnoreCase : ValidationAttribute, IClientValidatable
{
    #region Constructors and Destructors
public EqualToIgnoreCase(string otherProperty)
    {
        if (otherProperty == null)
        {
            throw new ArgumentNullException("otherProperty");
        }

        this.OtherProperty = otherProperty;
    }

    #endregion

    #region Public Properties

    public string OtherProperty { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get; private set; }

    #endregion

    #region Public Methods and Operators

   public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        ModelClientValidationRule compareRule = new ModelClientValidationRule();
        compareRule.ErrorMessage = this.ErrorMessageString;
        compareRule.ValidationType = "equaltoignorecase";
        compareRule.ValidationParameters.Add("otherpropertyname", this.OtherProperty);
        yield return compareRule;
    }

    #endregion

    #region Methods

   protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        PropertyInfo basePropertyInfo = validationContext.ObjectType.GetProperty(this.OtherProperty);

        IComparable valOther = (IComparable)basePropertyInfo.GetValue(validationContext.ObjectInstance, null);

        IComparable valThis = (IComparable)value;

        if (valOther.ToString().ToLower() == valThis.ToString().ToLower())
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("Error");
        }
    }

    #endregion
}

На стороне клиента вы должны будете добавить эту простую регистрацию:

var isEqualToIgnoreCase = function (value, element, param) {
    return this.optional(element) ||
    (value.toLowerCase() == $(param).val().toLowerCase());
};

$.validator.addMethod("equaltoignorecase", isEqualToIgnoreCase);
$.validator.unobtrusive.adapters.add("equaltoignorecase", ["otherpropertyname"], function (options) {
    options.rules["equaltoignorecase"] = "#" + options.params.otherpropertyname;
    options.messages["equaltoignorecase"] = options.message;
});
0 голосов
/ 09 октября 2013

Немного опоздал на вечеринку, но я только столкнулся с подобной проблемой. Это вызвано ошибкой в ​​ненавязчивом javascript-файле jquery. Более поздняя версия исправит это, я просто запустил

Install-Package jQuery.Validation.Unobtrusive

который установил v2, который прекрасно работает для меня. Ваш пробег может отличаться.

На этот вопрос был дан правильный ответ здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...