C'est un peu compliqué alors supportez-moi.Passer SelectList à travers ViewData aux modèles de l'éditeur - ne s'affiche pas correctement
Disons que j'ai un exemple d'une action d'édition du contrôleur défini comme:
Node nd = _repo.getNode(id);
List<Category> ac = new List<Category>();
ac.AddRange(_repo.getCategories());
SelectList acl = new SelectList(ac, "category_id", "category_name", ac.Where(cat => cat.category_id == nd.category_id).First());
ViewData["category_id"] = acl;
return View(nd);
La vue est templated comme ceci:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Myapp.Models.Node>" %>
<% if (ViewData.TemplateInfo.TemplateDepth > 1)
{ %>
<%= ViewData.ModelMetadata.SimpleDisplayText %>
<% }
else
{ %>
<table cellpadding="0" cellspacing="0" border="0">
<% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm)))
{ %>
<% if (prop.HideSurroundingHtml)
{ %>
<%= Html.Editor(prop.PropertyName) %>
<% }
else
{ %>
<tr>
<td>
<div class="editor-label" style="text-align: right;">
<%= prop.IsRequired ? "*" : ""%>
<%= Html.Label(prop.PropertyName)%>
</div>
</td>
<td>
<div class="editor-field">
<% if (ViewData.Keys.Contains(prop.PropertyName))
{
if ((ViewData[prop.PropertyName]).GetType().Name == "SelectList")
{ %>
<%= Html.DropDownList(prop.PropertyName, (SelectList)ViewData[prop.PropertyName])%>
<% }
else
{ %>
<%= Html.Editor(prop.PropertyName)%>
<% } %>
<% }
else
{ %>
<%= Html.Editor(prop.PropertyName)%>
<% } %>
<%= Html.ValidationMessage(prop.PropertyName, "*")%>
</div>
</td>
</tr>
<% } %>
<% } %>
</table>
<% } %>
Alors, que le modèle ne fait qu'afficher une liste déroulante pour chaque propriété pour laquelle ViewData["property_name"]
existe.
J'ai également défini DisplayName
attributs de métadonnées pour chaque propriété de ma classe de noeud.
Maintenant, les listes déroulantes affichent bien et sont remplis correctement, mais:
- La première valeur à partir d'une liste est toujours sélectionné, même si la SelectList valeur sélectionnée prédicat est très bien et ne fixe une valeur appropriée (dans le débogueur au moins). Html.Label dans le modèle renvoie un DisplayName correct pour les propriétés, mais lorsque je définis un ViewData pour afficher la liste déroulante, l'étiquette est réinitialisée au nom de propriété normal (par exemple
category_id
au lieu deCategory
).
Ce qui donne? Pouvez-vous penser à une façon «plus soignée» d'accomplir cette fonctionnalité?