Пользовательская проверка с использованием проверки ValidationAttribut
-
27-10-2019 - |
Вопрос
Я создал пользовательский валидатор, полученный из 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>
Чтение:
Решение
Мой Undertsandng состоит в том, что он будет генерировать достаточно мета -датчиков для автоматической проверки сценария на стороне клиента (с помощью jQuery.validate).
Ваше понимание неправильно. Вы не можете ожидать, что существует достаточно метаданных, чтобы генерировать проверку клиента. В этом IsValid
Метод вы можете сделать абсолютно что угодно. Вы можете даже вызвать неуправляемую библиотеку C ++ для выполнения проверки. Вы не можете ожидать, что ASP.NET MVC 3 будет отражать это на клиенте.
Вам нужно реализовать IClientValidatable и добавьте пользовательский адаптер, если вы хотите включить проверку клиента для такой пользовательской логики проверки. В этом адаптере вы должны переопределить ту же логику, которую вы сделали на сервере, но на этот раз использовать JavaScript.
Вот Один пример. Анкет И вот Еще один.
Как вы можете видеть, проверка на стороне клиента отлично работает с некоторыми простыми правилами, такими как необходимые и прочее, немного, как только вы начнете выполнять реальную проверку, вам придется реализовать ее самостоятельно.