Validation in Dropdownlist in ASP.Net MVC

3

I'm having trouble validating my dropdown in a view. In my model I use an annotation Required as shown in the code below:

Model

[Required(ErrorMessage="Informe uma cidade")]
[Display(Name="Cidade")]
public int CidadeID { get; set; }

View

 @Html.LabelFor(model => model.CidadeID, "CidadeID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("CidadeID", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CidadeID, "", new { @class = "text-danger" })
        </div>

But the validation is not performed for the dropdown. How can I resolve this?

    
asked by anonymous 22.04.2015 / 21:25

3 answers

1

Try the @required in the class attributes.

@Html.DropDownList("CidadeID", null, htmlAttributes: new { @required = "required", @class = "form-control" })
    
08.06.2016 / 18:34
1

If you put OptionLabel in your DropDownList it will work (in this case, Select in the example below).

You can follow this example:

@using (Html.BeginForm())
{
    <strong>@Html.LabelFor(e => e.CidadeId):</strong>
    <div>
        @Html.DropDownListFor(e => e.CidadeId, ViewBag.Cidades as IEnumerable<SelectListItem>, "Selecione")
        @Html.ValidationMessageFor(e => e.CidadeId)
    </div>
    <button type="submit">Enviar</button>
}

ViewBag implementation

ViewBag.Cidades = new List<SelectListItem>
{
    new SelectListItem { Text = "Cidade 1", Value="1"},
    new SelectListItem { Text = "Cidade 2", Value="2"},
    new SelectListItem { Text = "Cidade 3", Value="3"},
    new SelectListItem { Text = "Cidade 4", Value="4"},
    new SelectListItem { Text = "Cidade 5", Value="5"}
};

That's when you adapt to your reality.

    
22.04.2015 / 21:42
1

Just to exemplify how to display the message , I made these two examples based on your code, where when you click the button and do the Post without selecting an option, the screen displays the error message:

Example with ViewBag:

Model:

public class SeuModel
{
    [Required(ErrorMessage = "Informe uma cidade")]
    [Display(Name = "Cidade")]
    public int CidadeID { get; set; }
}

Controller:

        public ActionResult DropDown()
        {
            var model = new SeuModel();

            ViewBag.Cidades = new List<SelectListItem>
            {
                new SelectListItem { Text = "Selecione", Value="", Selected = true},
                new SelectListItem { Text = "Cidade 1", Value="1"},
                new SelectListItem { Text = "Cidade 2", Value="2"},
                new SelectListItem { Text = "Cidade 3", Value="3"},
                new SelectListItem { Text = "Cidade 4", Value="4"},
                new SelectListItem { Text = "Cidade 5", Value="5"}
            };

            return View(model);
        }

        [HttpPost]
        public ActionResult DropDown(SeuModel model)
        {
            if (ModelState.IsValid)
            {
                //Faça o processamento desejado dos dados
                return View(model);
            }

            //Porém se a propriedade IsValid do ModelState não estiver válida você terá que retornar a View com os dados. 
            //Então, verá a mensagem de validação quando a tela for renderizada.
            ViewBag.Cidades = new List<SelectListItem>
            {
                new SelectListItem { Text = "Selecione", Value="", Selected = true},
                new SelectListItem { Text = "Cidade 1", Value="1"},
                new SelectListItem { Text = "Cidade 2", Value="2"},
                new SelectListItem { Text = "Cidade 3", Value="3"},
                new SelectListItem { Text = "Cidade 4", Value="4"},
                new SelectListItem { Text = "Cidade 5", Value="5"}
            };

            return View(model);
        }

View:

@model SuaAplicacao.Models.SeuModel

<h2>Sua página</h2>

@using (Html.BeginForm())
{

    @Html.LabelFor(model => model.CidadeID, "CidadeID", htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownListFor(e => e.CidadeID, ViewBag.Cidades as IEnumerable<SelectListItem>, "Selecione")
        @Html.ValidationMessageFor(e => e.CidadeID)
    </div>

    <input type="submit" value="Enviar"/>
}

Example with ViewModel:

Model: I created a ViewModel called SeuModel. It is a class that will be used to get the data from the screen, much better than working with ViewBags.

        public class SeuModel
        {
            [Required(ErrorMessage = "Informe uma cidade")]
            [Display(Name = "Cidade")]
            public int CidadeID { get; set; } // Essa propriedade recebe o valor do item selecionado, se não vier valor a mensagem será exibida


            public List<SelectListItem> Cidades { get; set; } // Essa propriedade contém a lista dos itens

            public void PreencherListaCidades() // Esse método é para criar/recriar sua lista
            {
                Cidades = new List<SelectListItem>
                {
                    new SelectListItem { Text = "Selecione", Value="", Selected = true},
                    new SelectListItem { Text = "Cidade 1", Value="1"},
                    new SelectListItem { Text = "Cidade 2", Value="2"},
                    new SelectListItem { Text = "Cidade 3", Value="3"},
                    new SelectListItem { Text = "Cidade 4", Value="4"},
                    new SelectListItem { Text = "Cidade 5", Value="5"}
                };
            }        
        }

Controller:

    public ActionResult DropDown()
    {
        var model = new SeuModel();
        model.PreencherListaCidades();
        return View(model);
    }

    [HttpPost]
    public ActionResult DropDown(SeuModel model)
    {
        if (ModelState.IsValid)
        {
            //Faça o processamento desejado dos dados
            return View(model);
        }

        //Porém se a propriedade IsValid do ModelState não estiver válida você terá que retornar a View com os dados. 
        //Então, verá a mensagem de validação quando a tela for renderizada.
        model.PreencherListaCidades();
        return View(model);
    }

View: With the View of YourModel type you access the required properties and render the controls

@model SuaAplicacao.Models.SeuModel

<h2>Sua Página</h2>

@using (Html.BeginForm())
{

    @Html.LabelFor(model => model.CidadeID, "CidadeID", htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownListFor(model => model.CidadeID, Model.Cidades)
        @Html.ValidationMessageFor(model => model.CidadeID)
    </div>

    <input type="submit" value="Enviar"/>
}
    
12.07.2016 / 03:48