ASP.NET MVC запускает пользовательские валидаторы на стороне клиента - PullRequest
1 голос
/ 26 ноября 2011

Я пытаюсь использовать 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>

Но, к сожалению, валидатор не сработал на стороне клиента, кто-нибудь знает об этом?

1 Ответ

3 голосов
/ 26 ноября 2011

Если вы посмотрите на методы, использованные в этом ответе:

Пользовательская проверка MVC: сравните две даты

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...