io proprio non riesco a credere che ci sono persone che ancora utilizzano Viewdata/ViewBag in ASP.NET MVC 3, invece di avere una vista fortemente tipizzati e visualizzare i modelli:
public class MyViewModel
{
[Required]
public string CategoryId { get; set; }
public IEnumerable<Category> Categories { get; set; }
}
e nel controllore:
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");
}
}
e quindi nella vista fortemente tipizzato:
@Html.DropDownListFor(
x => x.CategoryId,
new SelectList(Model.Categories, "ID", "CategoryName"),
"-- Please select a category --"
)
@Html.ValidationMessageFor(x => x.CategoryId)
Inoltre, se si desidera che la validazione lato client non dimenticate di fare riferimento gli script necessari:
<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>
fonte
2011-01-18 22:52:30
Posso conoscere il motivo del supporto di Strongly type invece di ' ViewData/ViewBag' soprattutto nel contesto di Dropdownlist? – wwcdwdcw
@wwcdwdcw, perché sono fortemente tipizzati garantendo la sicurezza in fase di compilazione e sono compatibili con il refactoring. –
@ Html.DropDownListFor (x => x.CategoryId, nuova lista di selezione (Model.Categories, "ID", "CategoryName") .. - questo non è fortemente digitato. – Misi