Я пытаюсь использовать This Way для запуска пользовательского валидатора на стороне клиента, но он работает неправильно:
это моя модель и мой валидатор:
public class ExactStringAttribute : ValidationAttribute {
public string ValidName { get; set; }
public override bool IsValid(object value) {
if (value.ToString() == ValidName)
return true;
else
return false;
}
}
public class Teacher {
public long Id { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public int Age { get; set; }
[Display(Name = "SchoolName CustomValidator(ValidName='MySchool')")]
[ExactString(ValidName = "MySchool", ErrorMessage = "The Input Name must
exactly equal by Valid Name")]
public string SchoolName { get; set; }
}
это мой сценарий:
<script type="text/javascript">
Sys.Mvc.ValidatorRegistry.validators["exactstring"] = function (rule) {
// initialization code can go here.
var validname = rule.ValidationParameters["validname"];
// we return the function that actually does the validation
return function (value, context) {
if (value == validname) {
return true; /* success */
}
return rule.ErrorMessage;
};
};
</script>
и часть Global.asax:
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ExactStringAttribute),
typeof(ExactStringValidator));
}
public class ExactStringValidator :
DataAnnotationsModelValidator<ExactStringAttribute> {
string validName;
string errorMessage;
public ExactStringValidator(ModelMetadata metadata,
ControllerContext context
, ExactStringAttribute attribute)
: base(metadata, context, attribute) {
validName = attribute.ValidName;
}
public override IEnumerable<ModelClientValidationRule>
GetClientValidationRules() {
var rule = new ModelClientValidationRule {
ErrorMessage = errorMessage,
//Must be lowercase
ValidationType = "exactstring"
};
//Must be lowercase
rule.ValidationParameters.Add("validname", validName);
return new[] { rule };
}
}
А также я добавляю сценарий на _Layout Page:
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript">
</script>
<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript">
</script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript">
</script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")"
type="text/javascript"></script>
Часть контроллера:
[HandleError]
public class TeacherController : Controller {
......
}
Когда я добавляю Html.EnableClientValidation();
на странице просмотра, которая представляет ошибку об аргументе, но в файле web.config добавляется следующий параметр:
<appSettings>
<add key="webpages:Version" value="1.0.0.0"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
Но, к сожалению, валидатор не сработал на стороне клиента, кто-нибудь знает об этом?