Simplemente no puedo creer que haya gente que todavía utilizan ViewData/ViewBag en ASP.NET MVC 3 en lugar de tener puntos de vista inflexible de tipos y modelos de vista:
public class MyViewModel
{
[Required]
public string CategoryId { get; set; }
public IEnumerable<Category> Categories { get; set; }
}
y en su controlador:
public class HomeController: Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Categories = Repository.GetCategories()
}
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
if (!ModelState.IsValid)
{
// there was a validation error =>
// rebind categories and redisplay view
model.Categories = Repository.GetCategories();
return View(model);
}
// At this stage the model is OK => do something with the selected category
return RedirectToAction("Success");
}
}
y luego en su opinión inflexible:
@Html.DropDownListFor(
x => x.CategoryId,
new SelectList(Model.Categories, "ID", "CategoryName"),
"-- Please select a category --"
)
@Html.ValidationMessageFor(x => x.CategoryId)
Además, si quieres validación del lado del cliente no se olvide de hacer referencia a los scripts necesarios:
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
¿Puedo saber la razón detrás de apoyar Strongly type en lugar de ' ViewData/ViewBag' especialmente en el contexto Dropdownlist? – wwcdwdcw
@wwcdwdcw, porque están fuertemente tipados, lo que garantiza la seguridad en tiempo de compilación y son refactorios. –
@ Html.DropDownListFor (x => x.CategoryId, nueva SelectList (Model.Categories, "ID", "CategoryName") .. - esto no está fuertemente tipado. – Misi