Проверка ASP MVC 2: передача кода Javascript клиенту - PullRequest
0 голосов
/ 22 июля 2010

Я пишу пользовательский атрибут проверки. Он выполняет условную проверку между двумя полями. Когда я создаю свое правило, я не могу решить, как передать код JavaScript через ValidationParameters

Обычно я простоdo ValidationParameters ["Param1"] = "{обязательный: функция (элемент) {return $ (" # age "). val () <13;)}" </p>

Однако подпрограммы MicrosoftMvcJQueryValidation.js trnasforms этоto

Param1 = "{обязательный: функция (элемент) {return $ (" # age "). val () <13;)}" </p>

Я мог бы использовать Param1.eval ()в JavaScriptЭто выполнит оценку и выполнит код, но я просто хочу оценить код и выполнить его позже

Анализатор JSON не анализирует строку, содержащую код Javascript

Поэтому я прошу здесь любую идею

1 Ответ

1 голос
/ 23 июля 2010

Не уверен, как вы будете внедрять javascript, как вы описываете, но вы можете рассмотреть возможность использования пользовательского шаблона проверки для ASP.NET MVC 2 .

Важными компонентами являются ValidationAttribute,DataAnnotationsModelValidator, регистрация валидатора в Application_Start с помощью DataAnnotationsModelValidatorProvider.RegisterAdapter и коллекция функций Sys.Mvc.ValidatorRegistry.validators на стороне клиента для регистрации вашего кода проверки на стороне клиента.

Вот пример кода из моего поста.

[RegularExpression("[\\S]{6,}", ErrorMessage = "Must be at least 6 characters.")]
public string Password { get; set; }


[StringLength(128, ErrorMessage = "Must be under 128 characters.")]
[MinStringLength(3, ErrorMessage = "Must be at least 3 characters.")]
public string PasswordAnswer { get; set; }


public class MinStringLengthAttribute : ValidationAttribute
{
  public int MinLength { get; set; }

  public MinStringLengthAttribute(int minLength)
  {
    MinLength = minLength;
  }

  public override bool IsValid(object value)
  {
    if (null == value) return true;     //not a required validator
    var len = value.ToString().Length;
    if (len < MinLength)
      return false;
    else
      return true;
  }
}

public class MinStringLengthValidator : DataAnnotationsModelValidator<MinStringLengthAttribute>
{
  int minLength;
  string message;

  public MinStringLengthValidator(ModelMetadata metadata, ControllerContext context, MinStringLengthAttribute attribute)
    : base(metadata, context, attribute)
  {
    minLength = attribute.MinLength;
    message = attribute.ErrorMessage;
  }

  public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
  {
    var rule = new ModelClientValidationRule
    {
      ErrorMessage = message,
      ValidationType = "minlen"
    };
    rule.ValidationParameters.Add("min", minLength);
    return new[] { rule };
  }
}


protected void Application_Start()
{
  RegisterRoutes(RouteTable.Routes);
  DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(MinStringLengthAttribute), typeof(MinStringLengthValidator));
}


Sys.Mvc.ValidatorRegistry.validators["minlen"] = function(rule) {
  //initialization
  var minLen = rule.ValidationParameters["min"];

  //return validator function
  return function(value, context) {
    if (value.length < minLen) 
      return rule.ErrorMessage;
    else
      return true;  /* success */
  };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...