Just to illustrate how to display the message, made these two examples based on your code, where by clicking 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 screen data, 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 Seumodel View you access the necessary 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"/>
}
How are you populating this Dropdownlist?
– Randrade
var itens = db.Cidades.ToList();
Cidade itemCidade = new Cidade(); 
itens.Insert(0, itemCidade);ViewBag.CidadeID = new SelectList(itens, "CidadeID", "NomeCidade");
– Michel Lobo
Is the dropdown inside a form? When you generate the dropdown, the first value that appears on it has an empty value?
– Filipe Oliveira
The question is still open because answers have not solved?
– Renan