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