La mejor práctica de progtwigción de usar DropDownList en ASP.Net MVC

Estoy trabajando con MVC 5 durante unos meses, leo muchos artículos, foros y documentación, pero siempre me pregunto qué es mejor en la vista;

1) datos de enlace usando el método estático de modelo como aquí

2) vinculando los mismos datos usando ViewData [index] que está configurado en Controller que con el ejemplo anterior se verá así

@Html.DropDownListFor(n => n.MyColorId, ViewData[index]) 

Desea utilizar la opción 1, principalmente porque desea usar Strongly Type tanto como sea posible y corregir el error en tiempo de comstackción.

Por el contrario, ViewData y ViewBag son dynamics y la comstackción no pudo detectar el error hasta el tiempo de ejecución.

Aquí está el código de muestra que utilicé en muchas aplicaciones:

Modelo

 public class SampleModel { public string SelectedColorId { get; set; } public IList AvailableColors { get; set; } public SampleModel() { AvailableColors = new List(); } } 

Ver

 @model DemoMvc.Models.SampleModel @using (Html.BeginForm("Index", "Home")) { @Html.DropDownListFor(m => m.SelectedColorId, Model.AvailableColors)  } 

Controlador

 public class HomeController : Controller { public ActionResult Index() { var model = new SampleModel { AvailableColors = GetColorListItems() }; return View(model); } [HttpPost] public ActionResult Index(SampleModel model) { if (ModelState.IsValid) { var colorId = model.SelectedColorId; return View("Success"); } // If we got this far, something failed, redisplay form // ** IMPORTANT : Fill AvailableColors again; otherwise, DropDownList will be blank. ** model.AvailableColors = GetColorListItems(); return View(model); } private IList GetColorListItems() { // This could be from database. return new List { new SelectListItem {Text = "Orange", Value = "1"}, new SelectListItem {Text = "Red", Value = "2"} }; } } 

Yo diría, elementos desplegables completamente separados de ViewData . Haga que su modelo contenga una propiedad para el menú desplegable. Llene eso en su controlador y solo agréguelo en la vista como

ViewModel

 class MyModel { public IEnumerable dropdowndata {get; set;} } 

Controlador

 public Actionresult MyAction(string id) { IEnumerable mydata = callDALmethodtogetit(); Mymodel model = new MyModel { dropdowndata = mydata.Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.Name }); } } 

Ver

 @Html.DropDownListFor(model => model.dropdowndata, Model.dropdowndata)