J'essaie d'implémenter un Edit ViewModel pour mon entité Linq2SQL appelée Product. Il a une clé étrangère liée à une liste de marques.ViewModel avec liaison SelectList dans ASP.NET MVC2
Actuellement, je suis peuplait la liste des marques via ViewData et en utilisant DropDownListFor, ainsi:
<div class="editor-field">
<%= Html.DropDownListFor(model => model.BrandId, (SelectList)ViewData["Brands"])%>
<%= Html.ValidationMessageFor(model => model.BrandId) %>
</div>
Maintenant, je veux factoriser la vue d'utiliser un ViewModel et Html.EditorForModel() fortement typé:
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<%=Html.EditorForModel() %>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
Dans mon Modifier ViewModel, je donne les résultats suivants:
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;
}
}
le con Troller est configuré comme ceci:
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);
}
Le ProductId, le nom et l'affichage Description correctement dans la vue générée, mais la liste de sélection ne fonctionne pas. La liste des marques contient définitivement des données.
Si je fais ce qui suit à mon avis, le SelectList est 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'est-ce que je fais mal? Est-ce que EditorForModel() ne supporte pas génériquement la SelectList? Ai-je manqué une sorte de DataAnnotation?
Je n'arrive pas à trouver d'exemples d'utilisation de SelectList dans ViewModels. Je suis vraiment perplexe. This answer semble être proche, mais n'a pas aidé.
On dirait que la prochaine version pourrait soutenir ce que je cherche: http://aspalliance.com/1687_ASPNET_MVC_Preview_3_Release.3 – Junto