0

У меня есть ненавязчивая настройка проверки на стороне клиента для моей страницы. Сообщения об ошибках возвращаются из нашей базы данных. Для одного из сообщений проверки мне нужно было добавить параметры, чтобы я мог форматировать их с определенными значениями. Это отлично работает на стороне сервера, но я, очевидно, не получил доступ к некоторым из этих значений, когда метод GetClientValidationRules сначала настроен. Из-за этого похоже, что мне придется создавать сообщение об ошибке в моем клиентском коде, но я не знаю, как это сделать, поскольку вы просто возвращаете true или false в jQuery.validator.addMethod.MVC3 и пользовательские сообщения проверки на стороне клиента

Так что я в основном должен быть в состоянии сделать, это установить ErrorMessage в метод string.Empty в GetClientValidationRules, а затем в моем климатическом коде, который выполняет валидацию, сможет вернуть любое сообщение, которое я хочу.

Вот код на стороне клиента быть подключен в MVC 3.

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
         { 
          ValidationType = "maximumdatecoverrequired", 
          ErrorMessage = string.Empty, 
         }; 

     rule.ValidationParameters.Add("maxdate", DateTime.Now.AddDays(Settings.Default.MaximumDateCoverRequiredDaysInFuture).ToString("yyyy/MM/dd")); 

     return new[] { rule }; 
    } 

Вот мой клиентский код для проверки против этого конкретного свойства.

jQuery.validator.addMethod("maximumdatecoverrequired", function (value, element, params) { 
     var maxDate = new Date(params["maxdate"]); 
     var day = maxDate.getDate(); 
     var month = maxDate.getMonth() + 1; 
     var year = maxDate.getFullYear(); 

     var dateCoverRequired = new Date(value).toString('yyyy/MM/dd'); 
     maxDate = maxDate.toString('yyyy/MM/dd'); 

     if (value > maxDate) { 
      $("input#DateCoverRequired_Day").val(day); 
      $("select#DateCoverRequired_Month").val(month); 
      $("input#DateCoverRequired_Year").val(year); 
      return false; 
     } 

     return true; 
    }); 

Как вернуть пользовательское сообщение в моем клиентском коде?

+1

Что вы пытаетесь проверить? слишком много деталей отсутствует – gdoron

+0

gdoron - Я обновил свой вопрос тем, чего я пытаюсь выполнить. – doogdeb

+0

@doogdeb, обновите его еще раз и не забудьте включить свой код на этот раз. –

ответ

1

Позвольте мне привести пример того, как это сделать. Пример, который я выберет, - это регистрация нового пользователя и проверка его имени.

Мы собираемся сделать это, чтобы пользователь мог выбрать UserName и, если он уже существует в базе данных, мы не позволим им иметь его и сделаем предложение.

Для этого мы будем использовать удаленную проверку, которая указывает на ActionMethod в нашем контроллере.

Регистрация Модель

public class RegisterModel 
    { 
     //This is the one I'm giving you the code for... 
     [Required] 
     [RegularExpression(@"(\S)+", ErrorMessage = "Username cannot contain spaces.")] 
     [Remote("CheckUserName", HttpMethod="POST")] 
     [Display(Name = "Username")] 
     public string UserName { get; set; } 

     // You can do this one yourself :-) 
     [Required] 
     [Remote("CheckEmailAddress", ErrorMessage="{0} already has an account, please enter a different email address.", HttpMethod="POST")] 
     [DataAnnotationsExtensions.Email(ErrorMessage="{0} is not a valid email address.")] 
     [Display(Name = "Email address")] 
     public string Email { get; set; } 

     [Required] 
     [ValidatePasswordLength] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 

     [DataType(DataType.Password)] 
     [Display(Name = "Confirm password")] 
     [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
     public string ConfirmPassword { get; set; } 
    } 

ActionMethod (удаленный метод, на который ссылается модель)

[HttpPost] 
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)] 
public JsonResult CheckUserName(string userName, Guid? userId = null) 
{ 
    if (userName != null || userName.Length > 2) 
    { 
     var users = Membership.FindUsersByName(userName); 
     if (users.Count == 0) 
     { 
       return Json(true); 
     } 
     else 
     { 
      if ((users[userName].ProviderUserKey as Guid?) == userId) 
      { 
       return Json(true); 
      } 
      else 
      { 
       string suggestedUID = String.Format(CultureInfo.InvariantCulture, "{0} is not available.", userName); 
       // Maybe this is a bit feeble, but it will loop around (inefficiently) and suggest a new username with a number on the end. EG Tom is not available. Try Tom37 
       for (int i = 1; i < 100; i++) 
       { 
        string altCandidate = userName + i.ToString(); 
        if (Membership.FindUsersByName(altCandidate).Count == 0) 
        { 
         suggestedUID = String.Format(CultureInfo.InvariantCulture, "{0} is not available. Try {1}.", userName, altCandidate); 
         break; 
        } 
       } 
       // This is the important bit. I am returning a suggested UserName 
       return Json(suggestedUID, JsonRequestBehavior.AllowGet); 
      } 
     } 
    } 
    else 
    { 
     return Json(true); 
    } 
} 

Я думаю, что это очень здорово, потому что регулярное выражение убеждается есть нет пробелов и затем (если все в порядке), он отправляется удаленному методу, который проверяет базу данных.

 Смежные вопросы

  • Нет связанных вопросов^_^