Field without REQUIRED is mandatory, why?

0
using ExemploValidacao.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;

namespace ExemploValidacao.Controllers
{
    public class PessoaController : Controller
    {
        //
        // GET: /Pessoa/

        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(Pessoa pessoa) {
            if (ModelState.IsValid)
            {
                return View("Resultado", pessoa);
            }
            else
            {
                return View("Index", pessoa);
            }
        }

        public ActionResult Resultado(Pessoa pessoa)
        {
            return View(pessoa);
        }

        public ActionResult LoginUnico(string login) 
        {
            var bancoDeNomes = new Collection<string>{
                "Cleyton",
                "Anderson",
                "Renata"
            };
            return Json(bancoDeNomes.All(x => x.ToLower() != login.ToLower()), JsonRequestBehavior.AllowGet);
        }

    }
}

@model ExemploValidacao.Models.Pessoa

@{
    ViewBag.Title = "Index";
}

@section Scripts
    {
        @Scripts.Render("~/bundles/jqueryval")
    }

<h2>Index</h2>

@using (Html.BeginForm())
{ 
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Pessoa</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Nome, "Nome:")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Nome)
            @Html.ValidationMessageFor(model => model.Nome)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Observacao, "Obs:")
        </div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.Observacao)
            @Html.ValidationMessageFor(model => model.Observacao)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Idade, "Idade:")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Idade)
            @Html.ValidationMessageFor(model => model.Idade)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Email, "E-mail:")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Email)
            @Html.ValidationMessageFor(model => model.Email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Login, "Login:")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Login)
            @Html.ValidationMessageFor(model => model.Login)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Senha, "Senha:")
        </div>
        <div class="editor-field">
            @Html.PasswordFor(model => model.Senha)
            @Html.ValidationMessageFor(model => model.Senha)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ConfirmarSenha, "Confirmar Senha:")
        </div>
        <div class="editor-field">
            @Html.PasswordFor(model => model.ConfirmarSenha)
            @Html.ValidationMessageFor(model => model.ConfirmarSenha)
        </div>

        <p><input type="submit" value="CADASTRAR" /></p>

    </fieldset>
}

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;

namespace ExemploValidacao.Models
{
    public class Pessoa
    {
        [Required(ErrorMessage="Nome deve ser preenchido!")]
        public string Nome { get; set; }

        [StringLength(50, MinimumLength=5, ErrorMessage="A observação deve ter entre 5 a 50 caracteres")]
        public string Observacao { get; set; }

        [Range(18,50,ErrorMessage="A idade deve ter entre 18 e 50 anos")]
        public int Idade { get; set; }

        [RegularExpression("^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$", ErrorMessage="E-mail inválido!")]
        [Required(ErrorMessage="Campo e-mail é obrigatório!")]
        public string Email { get; set; }

        [RegularExpression(@"[a-zA-Z]{5,15}", ErrorMessage="Login deve ter somente letras e de 5 a 15 caracteres.")]
        [Required(ErrorMessage="O login deve ser preenchido!")]
        [Remote("LoginUnico", "Pessoa", ErrorMessage="Este nome de login já existe!" )]
        public string Login { get; set; }

        [Required(ErrorMessage = "A senha deve ser informada!")]
        public string Senha { get; set; }

        [System.ComponentModel.DataAnnotations.Compare("Senha", ErrorMessage = "As senhas não conferem!")]
        public string ConfirmarSenha { get; set; }
    }
}

My field "age" does not have REQUIRED, so it should not be mandatory, but even so it is, until the mandatory field message appears. Why does it happen? Even though I remove "ValidationMessageFor" it is mandatory, except that this time without the message, only the editor will have a red border. Something is making it mandatory, but I do not want it to be.

    
asked by anonymous 28.03.2018 / 20:59

1 answer

3

Change in your class the field from int to int? this indicates that the field is nullable . Your Pessoa class would look like this:

public class Pessoa
{
    [Required(ErrorMessage="Nome deve ser preenchido!")]
    public string Nome { get; set; }

    [StringLength(50, MinimumLength=5, ErrorMessage="A observação deve ter entre 5 a 50 caracteres")]
    public string Observacao { get; set; }

    [Range(18,50,ErrorMessage="A idade deve ter entre 18 e 50 anos")]
    public int? Idade { get; set; }

    [RegularExpression("^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$", ErrorMessage="E-mail inválido!")]
    [Required(ErrorMessage="Campo e-mail é obrigatório!")]
    public string Email { get; set; }

    [RegularExpression(@"[a-zA-Z]{5,15}", ErrorMessage="Login deve ter somente letras e de 5 a 15 caracteres.")]
    [Required(ErrorMessage="O login deve ser preenchido!")]
    [Remote("LoginUnico", "Pessoa", ErrorMessage="Este nome de login já existe!" )]
    public string Login { get; set; }

    [Required(ErrorMessage = "A senha deve ser informada!")]
    public string Senha { get; set; }

    [System.ComponentModel.DataAnnotations.Compare("Senha", ErrorMessage = "As senhas não conferem!")]
    public string ConfirmarSenha { get; set; }
}
    
28.03.2018 / 21:11