How to remove mask from the field before calling the controller with Asp net MVC

Asked

Viewed 1,182 times

4

In my registration form I have a CNPJ field with the mask set via jquery $("#cnpj").mask("99.999.999/9999-99"); however the value is coming in my formatted controller, in my database this field is float, there is a way to treat this without turning the field into string and performing the replace?

2 answers

1

Whoa, what’s up, man? A valid alternative is for you to put the input for your model as Hidden type:

@Html.HiddenFor(model => model.Cnpj)

And then change the value of this field when filling in your field with mascara, let’s call it cnpj-with-Mask, ok?

Would look like this:

var options =  { 
  onChange: function(cnpj){
    $("#cnpj").val(cnpj);
  }
};

$('#cnpj-with-mask').mask('99.999.999/9999-99', options);

0

The way I found to solve it is based on a field string unmapped in Model and another decimal, this yes mapped:

    [Required]
    public Decimal Cnpj { get; set; }

    [NotMapped]
    [Cnpj] 
    public String CnpjMascara { get; set; }

I do not recommend using float for CNPJ because float is a structure that works well with numbers that have mantissa and characteristic, which is not the case of the CNPJ.

The Attribute for validation of CNPJ is below:

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

        int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
        int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };

        int soma, resto;

        string digito, tempCnpj, CNPJ;

        CNPJ = value.ToString().Trim();
        CNPJ = CNPJ.Replace(".", "").Replace("-", "").Replace("/", "");

        if (CNPJ.Length != 14)
            return new ValidationResult("CNPJ Inválido.");

        tempCnpj = CNPJ.Substring(0, 12);
        soma = 0;

        for (int i = 0; i < 12; i++)
            soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];
        resto = (soma % 11);

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

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

        for (int i = 0; i < 13; i++)
            soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];
        resto = (soma % 11);

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

        digito = digito + resto.ToString();

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

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

Like CnpjMascara is already validated by the attribute, you only need to make the assignment to the corresponding type before going through the ModelState:

    [HttpPost]
    public ActionResult Create(Empresa empresa)
    {
        if (empresa.CnpjMascara != null)
            empresa.Cnpj = Decimal.Parse(empresa.CnpjMascara.Replace(".", "").Replace("-", ""));

        if (ModelState.IsValid)
        {
           /* Coloque aqui a lógica padrão */
        }
    }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.