ValidationAttribute에서 파생 된 사용자 지정 유효성 검사기를 만들었습니다. 저의 밑바탕은 클라이언트 측 스크립트가 (jquery.validate를 사용하여) 자동으로 유효성을 검사하기에 충분한 메타 데이터를 생성한다는 것입니다. 사용자 정의 유효성 검사기가 서버 측에서 정상적으로 작동합니다. 하지만 클라이언트 쪽에서 오류 메시지가 발생하지 않습니다. ("StringLength"와 같은 다른 기본 유효성 검사기도 클라이언트 측에서 잘 작동합니다.) 어떻게 수정합니까?ValidationAttribute를 사용하는 사용자 지정 유효성 검사가 클라이언트 측 유효성 검사를 실행하지 않습니다.
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>
READING :
In ASP.NET MVC3 how do you stay DRY with very similar but slightly different viewmodels?
,342,276,261,594,258,973,210
http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html
Clientside Validation in "Self Validate Model" in ASP.NET-MVC3
감사합니다. 그래서 그것은 정말로 건조하지 않은가? :-) 사용자 정의 유효성 검사 인 경우이를 반복해야합니다. – Lijo
@Lijo, 예, DRY가 아닙니다. 그러나 그것이 그 방법입니다. 클라이언트에서 이러한 맞춤 규칙을 구현하는 것이 왜 효과가 있습니까? 물론 절대적으로 필요하다면 자바 스크립트 작성을 준비하십시오. –
감사합니다. 한 가지 더 묻습니다. 자체 유효성 검사 접근법을 사용하고 있다면 클라이언트 스크립트를 작성할 수 있습니까? – Lijo