Пользовательская проверка с использованием проверки ValidationAttribut

StackOverflow https://stackoverflow.com/questions/9348513

Вопрос

Я создал пользовательский валидатор, полученный из ValidationAttribute. Мой Undertsandng состоит в том, что он будет генерировать достаточно мета -датчиков для автоматической проверки сценария на стороне клиента (с помощью 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;
    }

}

ПОСМОТРЕТЬ

@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-uunobtrusize-validation.html

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

  6. Как я могу иметь пользовательский ValidationAttribute, отображаемый как атрибут «Data-Val-XX» на стороне клиента?

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

Это было полезно?

Решение

Мой Undertsandng состоит в том, что он будет генерировать достаточно мета -датчиков для автоматической проверки сценария на стороне клиента (с помощью jQuery.validate).

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

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

Вот Один пример. Анкет И вот Еще один.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top