Я создал пользовательский атрибут аннотации удаленных данных под названием 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 должен отображаться как сообщение об ошибке. Но ошибка всегда отображается как Поле Название недействительно . Пожалуйста, помогите мне в решении этой проблемы.