www net mvc5 mvc4 mvc framework asp asp.net-mvc-3

asp.net-mvc-3 - mvc5 - www asp net mvc mvc4



ASP.Net MVC 3 validaciĆ³n de clientes personalizada discreta (2)

Aquí es cómo podría proceder. Primero debe escribir un atributo de validador personalizado para garantizar que la validación se aplique en el lado del servidor. Puedes usar el que se describe en esta publicación de blog :

public class CreditCardAttribute : ValidationAttribute, IClientValidatable { private CardType _cardTypes; public CardType AcceptedCardTypes { get { return _cardTypes; } set { _cardTypes = value; } } public CreditCardAttribute() { _cardTypes = CardType.All; } public CreditCardAttribute(CardType AcceptedCardTypes) { _cardTypes = AcceptedCardTypes; } public override bool IsValid(object value) { var number = Convert.ToString(value); if (String.IsNullOrEmpty(number)) return true; return IsValidType(number, _cardTypes) && IsValidNumber(number); } public override string FormatErrorMessage(string name) { return "The " + name + " field contains an invalid credit card number."; } public enum CardType { Unknown = 1, Visa = 2, MasterCard = 4, Amex = 8, Diners = 16, All = CardType.Visa | CardType.MasterCard | CardType.Amex | CardType.Diners, AllOrUnknown = CardType.Unknown | CardType.Visa | CardType.MasterCard | CardType.Amex | CardType.Diners } private bool IsValidType(string cardNumber, CardType cardType) { // Visa if (Regex.IsMatch(cardNumber, "^(4)") && ((cardType & CardType.Visa) != 0)) return cardNumber.Length == 13 || cardNumber.Length == 16; // MasterCard if (Regex.IsMatch(cardNumber, "^(51|52|53|54|55)") && ((cardType & CardType.MasterCard) != 0)) return cardNumber.Length == 16; // Amex if (Regex.IsMatch(cardNumber, "^(34|37)") && ((cardType & CardType.Amex) != 0)) return cardNumber.Length == 15; // Diners if (Regex.IsMatch(cardNumber, "^(300|301|302|303|304|305|36|38)") && ((cardType & CardType.Diners) != 0)) return cardNumber.Length == 14; //Unknown if ((cardType & CardType.Unknown) != 0) return true; return false; } private bool IsValidNumber(string number) { int[] DELTAS = new int[] { 0, 1, 2, 3, 4, -4, -3, -2, -1, 0 }; int checksum = 0; char[] chars = number.ToCharArray(); for (int i = chars.Length - 1; i > -1; i--) { int j = ((int)chars[i]) - 48; checksum += j; if (((i - chars.Length) % 2) == 0) checksum += DELTAS[j]; } return ((checksum % 10) == 0); } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = this.ErrorMessage, ValidationType = "creditcard" }; } }

Observe que lo he modificado para que implemente la interfaz IClientValidatable y agregué el método GetClientValidationRules que simplemente usa el mismo mensaje de error para la validación del cliente que el servidor y proporciona un nombre único para este validador que utilizará el adaptador discreto de jquery . Ahora todo lo que queda es decorar la propiedad de tu modelo con este atributo:

[CreditCard(ErrorMessage = "Please enter a valid credit card number")] [Required] public string CardNumber { get; set; }

y en su opinión:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> <script type="text/javascript"> $(function () { jQuery.validator.unobtrusive.adapters.addBool(''creditcard''); }); </script> @using (Html.BeginForm()) { @Html.TextBoxFor(x => x.CardNumber) @Html.ValidationMessageFor(x => x.CardNumber) <input type="submit" value="OK" /> }

He utilizado el complemento de validación de jquery desde hace un par de años, pero este es mi primer esfuerzo para mezclar con la validación discreta de MVC 3.

La información sobre el lado del cliente de las cosas se encuentra dispersa por todo el Internet y es difícil encontrar algo que sea lo suficientemente profundo como para explicárselo a las personas que aún no lo han utilizado. He estado quemando Google durante una hora ahora para ver un ejemplo sobre cómo crear un validador de cliente personalizado.

@Html.TextBoxFor(model => Model.CCPayment.CardNumber, new { @class = "textInput validateCreditCard", maxLength = "20" }) $(document).ready(function () { jQuery.validator.unobtrusive.adapters.add(''validateCreditCard'', {}, function (value, element) { alert(''foo''); }); });

si ejecuto el código anterior en la parte inferior de mi vista, no hace absolutamente nada. Incluso he intentado jquery.validator.addmethod () y todavía nada. Toda la validación del lado del cliente que se emite de mis anotaciones de validación de modelo funciona bien.

<div class="ctrlHolder"> <label> <em>*</em> Card Number: </label> @Html.TextBoxFor(model => Model.CCPayment.CardNumber, new { @class = "textInput validateCreditCard", maxLength = "20" }) <p class="field-validation-valid formHint" data-valmsg-for="CCPayment.CardNumber"></p> </div>


Necesitas ValidateFor además de TextBoxFor . No puedo decir de tu pregunta si ya lo has hecho o no. También necesita EnableClientValidation antes del formulario.