: 그것으로보기 모델을 장식 한 후
public class DynamicRangeValidator : ValidationAttribute, IClientValidatable
{
private readonly string _minPropertyName;
private readonly string _maxPropertyName;
public DynamicRangeValidator(string minPropertyName, string maxPropertyName)
{
_minPropertyName = minPropertyName;
_maxPropertyName = maxPropertyName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var minProperty = validationContext.ObjectType.GetProperty(_minPropertyName);
var maxProperty = validationContext.ObjectType.GetProperty(_maxPropertyName);
if (minProperty == null)
{
return new ValidationResult(string.Format("Unknown property {0}", _minPropertyName));
}
if (maxProperty == null)
{
return new ValidationResult(string.Format("Unknown property {0}", _maxPropertyName));
}
int minValue = (int)minProperty.GetValue(validationContext.ObjectInstance, null);
int maxValue = (int)maxProperty.GetValue(validationContext.ObjectInstance, null);
int currentValue = (int)value;
if (currentValue <= minValue || currentValue >= maxValue)
{
return new ValidationResult(
string.Format(
ErrorMessage,
minValue,
maxValue
)
);
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ValidationType = "dynamicrange",
ErrorMessage = this.ErrorMessage,
};
rule.ValidationParameters["minvalueproperty"] = _minPropertyName;
rule.ValidationParameters["maxvalueproperty"] = _maxPropertyName;
yield return rule;
}
}
과 :
public class RangeValidationSampleModel
{
[DynamicRangeValidator("MinValue", "MaxValue", ErrorMessage = "Value must be between {0} and {1}")]
public int Value { get; set; }
public int MinValue { get; set; }
public int MaxValue { get; set; }
}
는 다음 뷰를 제공하는 컨트롤러를 할 수 :
를
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new RangeValidationSampleModel
{
Value = 5,
MinValue = 6,
MaxValue = 8
});
}
[HttpPost]
public ActionResult Index(RangeValidationSampleModel model)
{
return View(model);
}
}
물론보기 :
@model RangeValidationSampleModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
$.validator.unobtrusive.adapters.add('dynamicrange', ['minvalueproperty', 'maxvalueproperty'],
function (options) {
options.rules['dynamicrange'] = options.params;
if (options.message != null) {
$.validator.messages.dynamicrange = options.message;
}
}
);
$.validator.addMethod('dynamicrange', function (value, element, params) {
var minValue = parseInt($('input[name="' + params.minvalueproperty + '"]').val(), 10);
var maxValue = parseInt($('input[name="' + params.maxvalueproperty + '"]').val(), 10);
var currentValue = parseInt(value, 10);
if (isNaN(minValue) || isNaN(maxValue) || isNaN(currentValue) || minValue >= currentValue || currentValue >= maxValue) {
var message = $(element).attr('data-val-dynamicrange');
$.validator.messages.dynamicrange = $.validator.format(message, minValue, maxValue);
return false;
}
return true;
}, '');
</script>
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(x => x.Value)
@Html.EditorFor(x => x.Value)
@Html.ValidationMessageFor(x => x.Value)
</div>
<div>
@Html.LabelFor(x => x.MinValue)
@Html.EditorFor(x => x.MinValue)
</div>
<div>
@Html.LabelFor(x => x.MaxValue)
@Html.EditorFor(x => x.MaxValue)
</div>
<button type="submit">OK</button>
}
분명히 사용자 정의 어댑터 등록은 뷰를 오염시키는 것을 피하기 위해 외부 자바 스크립트 파일에서 수행해야하지만이 포스트의 목적과 간결함을 위해 뷰 내부에 넣었습니다.
클라이언트 측 유효성 검사가 필요합니까? –
좋습니다. 우리는이 사이트를 MVC2에서 MVC3으로 변환하고 있습니다. 현재 MVC2 유효성 검사가 클라이언트 측에서 작동하고 있으므로이 방법을 계속 사용하고 싶습니다. 그러나 가능한 경우 눈에 거슬리지 않은 유효성 검사를 사용하고 싶습니다. 현재 유효성 검사는 매우 눈에 띄지 않습니다. :) –