отображение пользовательского сообщения об ошибке на стороне клиента для пользовательского атрибута аннотации данных в MVC 2 - PullRequest
1 голос
/ 13 декабря 2011

Я создал пользовательский атрибут аннотации удаленных данных под названием remoteVal в MVC 2, как показано ниже

public class remoteValAttribute:ValidationAttribute
{
    public string Action { get; set; }
    public string Controller { get; set; }
    public string ParameterName { get; set; }
    public string RouteName { get; set; }

    public override bool IsValid(object value)
    {
        return true;
    }
}

Адаптер класса

public class RemoteAttributeAdapter:DataAnnotationsModelValidator<remotevalAttribute>
{
    public RemoteAttributeAdapter(ModelMetadata metadata, ControllerContext context, remoteVal attribute) : base(metadata, context, attribute) { }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        ModelClientValidationRule rule = new ModelClientValidationRule()
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "remoteVal"
        };

        rule.ValidationParameters["url"] = GetUrl();
        rule.ValidationParameters["parameterName"] = Attribute.ParameterName;
        return new ModelClientValidationRule[] { rule };
    }

    private string GetUrl()
    {
        RouteValueDictionary rvd = new RouteValueDictionary(){
            {"controller",Attribute.Controller},
            {"action",Attribute.Action}
        };

        var virtualPath = RouteTable.Routes.GetVirtualPath(ControllerContext.RequestContext, Attribute.RouteName, rvd);
        if (virtualPath == null)
        {
            throw new InvalidOperationException("No route matched!");
        }

        return virtualPath.VirtualPath;
    }
}

Добавлен атрибут в классе модели

[Required(ErrorMessage = "Title Required")]
[remoteVal(Controller = "Validation", Action = "IsTitle_Available", ParameterName = "Title")]
[ScaffoldColumn(false)]
public object Title { get; set; }

Добавлен скрипт jQuery, как показано ниже

<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script>
<script type="text/javascript" src="../../Scripts/jquery.validate.js"></script>
<script type="text/javascript" src="../../Scripts/MicrosoftMvcJQueryValidation.js"></script>
<script type="text/javascript">
        $(function () {
            var ermessage = '';
            jQuery.validator.addMethod("remoteVal", function (value, element, params) {
                var validator = this;
                var valid = false;
                if (this.optional(element)) {
                    return true;
                }
                else {
                    var url = params.url;
                    var parameterName = params.parameterName;

                    var newUrl = ((url.indexOf('?') < 0) ? (url + '?') : (url + '&'))
                                + encodeURIComponent(parameterName) + '=' + encodeURIComponent(value);

                    var response = $.ajax({
                        url: newUrl,
                        async: false
                    }).responseText;

                    if (response == 'OK')
                        valid = true;
                    else {
                        valid = false;
                        var errors = {};
                        errors[element.name] = response;
                        validator.showErrors(errors);
                    }
                }
                return valid;
            });
        });
</script>

Если Заголовок уже зарегистрирован, Ответ от вызова AJAX должен отображаться как сообщение об ошибке. Но ошибка всегда отображается как Поле Название недействительно . Пожалуйста, помогите мне в решении этой проблемы.

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