Пользовательская проверка с использованием ValidationAttribute не запускает проверку на стороне клиента - PullRequest
2 голосов
/ 19 февраля 2012

Я создал собственный валидатор, производный от ValidationAttribute. Я понимаю, что он будет генерировать достаточно метаданных для сценария на стороне клиента для автоматической проверки (с использованием jquery.validate). Пользовательский валидатор работает нормально на стороне сервера. Но это не вызывает сообщение об ошибке на стороне клиента. (Другие валидаторы по умолчанию, такие как «StringLength», отлично работают и на стороне клиента.) Как мы можем это исправить?

public class Person
{
    [Required(ErrorMessage = "First name required")]
    public string FirstName { get; set; }

    [CustomStartLetterMatch("FirstName")]
    [StringLength(5,ErrorMessage = "Must be under 5 characters")]
    public string LastName { get; set; }

    [Range(18,50,ErrorMessage="Must be between 18 and 50")]
    public int Age { get; set; }


}


public sealed class CustomStartLetterMatch : ValidationAttribute
{

    private const string _defaultErrorMessage = " First letter of '{0}' must be same as first letetr of '{1}'";
    private string _basePropertyName;

    public CustomStartLetterMatch(string basePropertyName)
        : base(_defaultErrorMessage)
    {
        _basePropertyName = basePropertyName;
    }


    //Override FormatErrorMessage Method
    public override string FormatErrorMessage(string name)
    {
        return string.Format(_defaultErrorMessage, name, _basePropertyName);
    }


    //Override IsValid
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        //Get PropertyInfo Object
        var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName);
        var baseValue = (string)basePropertyInfo.GetValue(validationContext.ObjectInstance, null);
        var currentValue = (string)value;


        string firstLetterBaseValue = baseValue.Substring(0, 1);
        string firstLetterCurrentValue = currentValue.Substring(0, 1);

        //Comparision
        if (!string.Equals(firstLetterBaseValue, firstLetterCurrentValue))
        {
            var message = FormatErrorMessage(validationContext.DisplayName);
            return new ValidationResult(message);
        }

        //Default return - This means there were no validation error
        return null;
    }

}

VIEW

@model MyValidationTEST.Person

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript">  </script>

@*UnObtrusive*@
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>




@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Person</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.FirstName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FirstName)
        @Html.ValidationMessageFor(model => model.FirstName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.LastName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.LastName)
        @Html.ValidationMessageFor(model => model.LastName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Age)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Age)
        @Html.ValidationMessageFor(model => model.Age)
    </div>



    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

ЧТЕНИЕ:

  1. IValidatableObject в MVC3 - проверка на стороне клиента

  2. В ASP.NET MVC3 как вы остаетесь сухим с очень похожими, но немного отличающимися моделями представления?

  3. http://odetocode.com/Blogs/scott/archive/2011/02/22/custom-data-annotation-validator-part-ii-client-code.aspx

  4. http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

  5. Проверка на стороне клиента ASP.NET MVC 3 с параметрами

  6. Как я могу иметь собственный атрибут ValidationAttribute, отображаемый как атрибут «data-val-xx» на стороне клиента?

  7. Проверка на стороне клиента в «Самостоятельной модели» в ASP.NET-MVC3

1 Ответ

5 голосов
/ 19 февраля 2012

Моя недоумение заключается в том, что он сгенерирует достаточно метаданных для сценария на стороне клиента для автоматической проверки (с использованием jquery.validate).

Ваше понимание неверно.Вы не можете ожидать, что достаточно метаданных для генерации проверки клиента.В этом IsValid методе вы можете делать абсолютно все.Вы можете даже вызвать неуправляемую библиотеку C ++ для проверки.Вы не можете ожидать, что ASP.NET MVC 3 отразит это на клиенте.

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

Вот один пример .А вот еще один .

Как вы можете видеть, проверка на стороне клиента отлично работает с некоторыми простыми правилами, такими как Required и прочее, но, как только вы начнете выполнять какую-либо реальную проверку, вам придется реализовать ее самостоятельно.

...