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 */
}
}