InputMask by model

3
Hello, I'm using the jQuery - maskedInput plugin, where I get the id of my input and make the mask:

$("#CPF").mask("999.999.999-99");

is working, only I would like to use this mask through model , without the need for an external js

    [RegularExpression(@"[0-9.-]{14}", ErrorMessage = "CPF deve conter apenas números")]
    public string CPF { get; set; }

Thank you

    
asked by anonymous 25.11.2015 / 17:31

1 answer

4

Actually you want to validate the CPF in Controller , if I understand you correctly.

Implement the CPF validation attribute:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class CpfAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null) return null;

        int soma = 0, resto = 0;
        string digito;
        int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
        int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };

        string CPF = value.ToString().Replace(".", "").Replace("-", "");

        if (CPF.Length != 11)
            return new ValidationResult("CPF Inválido.");

        if (Convert.ToUInt64(CPF) % 11111111111 == 0)
            return new ValidationResult("CPF Inválido.");

        string tempCpf = CPF.Substring(0, 9);

        for (int i = 0; i < 9; i++)
            soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];

        resto = soma % 11;
        if (resto < 2)
            resto = 0;
        else
            resto = 11 - resto;

        digito = resto.ToString();
        tempCpf = tempCpf + digito;
        soma = 0;

        for (int i = 0; i < 10; i++)
            soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];

        resto = soma % 11;

        if (resto < 2)
            resto = 0;
        else
            resto = 11 - resto;

        digito = digito + resto.ToString();

        if (CPF.EndsWith(digito))
            return null;
        else
            return new ValidationResult("CPF Inválido.");
    }

    public override string FormatErrorMessage(string name)
    {
        return name;
    }
}

Then decorate the property with it:

[RegularExpression(@"[0-9.-]{14}", ErrorMessage = "CPF deve conter apenas números")]
[Cpf]
public string CPF { get; set; }

About not using JS in View , it's something I've been trying for some time to do and I can not do it in a satisfactory way. I asked this question some time ago , but that the answer does not go to 100% of what I wanted.

    
25.11.2015 / 17:37