asp.net-mvc - template - webapplayers
Plantilla del Editor de ASP.NET MVC DropDown (3)
Estoy buscando el mejor método para crear una plantilla de editor de lista desplegable con MVC. Parece haber varios métodos, pero no puedo encontrar ningún método que sea el mejor, todos parecen hacerlo de manera diferente. Estoy usando MVC3 con Razor también, por lo que se prefiere un método que funcione con esto.
Hay muchas maneras y decir cuál es el mejor sería subjetivo y podría no funcionar en su escenario, que por cierto se olvidó de describir en su pregunta. Así es como lo hago:
Modelo:
public class MyViewModel
{
public string SelectedItem { get; set; }
public IEnumerable<Item> Items { get; set; }
}
public class Item
{
public string Value { get; set; }
public string Text { get; set; }
}
Controlador:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
// TODO: Fetch this from a repository
Items = new[]
{
new Item { Value = "1", Text = "item 1" },
new Item { Value = "2", Text = "item 2" },
new Item { Value = "3", Text = "item 3" },
}
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
if (!ModelState.IsValid)
{
// redisplay the view to fix validation errors
return View(model);
}
// TODO: The model is valid here =>
// perform some action using the model.SelectedItem
// and redirect to a success page informing the user
// that everything went fine
return RedirectToAction("Success");
}
}
Ver ( ~/Views/Home/Index.cshtml
):
@model MyApp.Models.MyViewModel
@{ Html.BeginForm(); }
@Html.EditorForModel()
<input type="submit" value="OK" />
@{ Html.EndForm(); }
Plantilla del editor ( ~/Views/Home/EditorTemplates/MyViewModel.cshtml
):
@model MyApp.Models.MyViewModel
@Html.DropDownListFor(x => x.SelectedItem,
new SelectList(Model.Items, "Value", "Text"))
Personalmente, creo que los elementos de la lista deben colocarse en los datos de visualización, no en el modelo de vista, pero realmente depende si está mostrando un menú desplegable que nunca cambia (usando datos de visualización) o si tendrá que modificarlo dinámicamente (utilizando una vista modelo).
En el ejemplo, está publicando el mismo modelo de vista en la acción de índice. La acción de índice solo está interesada en el elemento seleccionado, por lo que podría cambiar el parámetro de la acción de publicación de índice para que sea string selectedItem. De esta forma, la carpeta de modelo buscará en los parámetros de formulario y rellenará el parámetro de índice por usted.
Además, creo que sería mejor pasar una lista de SelectedListItems a la vista de esa manera no necesitaría ninguna conversión y no necesitaría la clase Item.
Este es mi enfoque desde esta publicación: