2010-12-06 29 views
0

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:

  1. 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 de Category).

Ce qui donne? Pouvez-vous penser à une façon «plus soignée» d'accomplir cette fonctionnalité?

Répondre

1

Allright, la réponse de personne il n'y a donc ma réponse, peut-être il est très pratique pour quelqu'un:

Ne pas utiliser vos noms de propriété pour les clés vidéotex! Cela dérange le modèle de vue, de sorte que vos vues deviennent confuses et commencent à se comporter étrangement.

En fait, mieux vaut éviter les désordres magiques entièrement, mais si vous insistez, utilisez simplement quelque chose comme
ex.: ViewData[prop.PropertyName+"_list"]. Vos opinions vont bien se passer maintenant.