MVC3 и пользовательские сообщения проверки на стороне клиента - PullRequest
0 голосов
/ 15 декабря 2011

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

Итак, что мне в основном нужно сделать, это установить 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 Ответ

1 голос
/ 15 декабря 2011

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

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

Для этого мы будем использовать удаленную проверку, которая указывает на 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 (метод Remote, на который ссылается модель)

[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);
    }
}

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

...