Estoy tratando de implementar un Edit ViewModel para mi entidad Linq2SQL llamada Producto. Tiene una clave externa vinculada a una lista de marcas.ViewModel con enlace SelectList en ASP.NET MVC2
Actualmente estoy poblando la lista de marca a través de ViewData y el uso de DropDownListFor, por lo tanto:
<div class="editor-field">
<%= Html.DropDownListFor(model => model.BrandId, (SelectList)ViewData["Brands"])%>
<%= Html.ValidationMessageFor(model => model.BrandId) %>
</div>
Ahora quiero refactorizar el fin de utilizar un modelo de vista inflexible y Html.EditorForModel():
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<%=Html.EditorForModel() %>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
En mi modelo de vista Editar, Tengo el siguiente:
public class EditProductViewModel
{
[HiddenInput]
public int ProductId { get; set; }
[Required()]
[StringLength(200)]
public string Name { get; set; }
[Required()]
[DataType(DataType.Html)]
public string Description { get; set; }
public IEnumerable<SelectListItem> Brands { get; set; }
public int BrandId { get; set; }
public EditProductViewModel(Product product, IEnumerable<SelectListItem> brands)
{
this.ProductId = product.ProductId;
this.Name = product.Name;
this.Description = product.Description;
this.Brands = brands;
this.BrandId = product.BrandId;
}
}
el aire Troller se configura de este modo:
public ActionResult Edit(int id)
{
BrandRepository br = new BrandRepository();
Product p = _ProductRepository.Get(id);
IEnumerable<SelectListItem> brands = br.GetAll().ToList().ToSelectListItems(p.BrandId);
EditProductViewModel model = new EditProductViewModel(p, brands);
return View("Edit", model);
}
El ProductId, Nombre y Descripción muestran correctamente en la vista generada, pero la lista de selección no lo hace. La lista de marcas definitivamente contiene datos.
Si hago lo siguiente, en mi opinión, la SelectList es visible:
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<%=Html.EditorForModel() %>
<div class="editor-label">
<%= Html.LabelFor(model => model.BrandId) %>
</div>
<div class="editor-field">
<%= Html.DropDownListFor(model => model.BrandId, Model.Brands)%>
<%= Html.ValidationMessageFor(model => model.BrandId) %>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
¿Qué estoy haciendo mal? ¿EditorForModel() no admite genéricamente SelectList? ¿Me falta algo de DataAnnotation?
Parece que no puedo encontrar ejemplos del uso de SelectList en ViewModels que ayudan. Estoy realmente perplejo. This answer parece estar cerca, pero no ha ayudado.
Parece que la próxima versión podría ser compatible con lo que estoy buscando: http://aspalliance.com/1687_ASPNET_MVC_Preview_3_Release.3 – Junto