2010-11-11 3 views
1

Il me manque quelque chose de simple ici. Ce code fonctionnait et je n'arrive pas à comprendre pourquoi il s'est arrêté.Comment obtenir Html.DropdownFor() pour sélectionner l'élément actuel?

D'abord, je produis un SelectList dans le contrôleur comme ceci:

 // Select List 
     ViewData["FieldTypesList"] = new SelectList(
      genesisRepository.FieldTypes, "ftID", "ftName" 
      ); 

La vue qui utilise cette liste de sélection ressemble à ceci:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Genesis.Domain.Entities.Stream2FieldTypes>" %> 
    <%@ Import Namespace="Genesis.Domain.Entities" %>   
    <%: Html.DropDownListFor(
      model => model.FieldTypeID, 
      (SelectList)ViewData["FieldTypesList"] 
      )%> 
    <%:Model.FieldTypeID.ToString() %> 

Mais ... le code HTML qui obtient généré montre ceci:

<select id="Stream2FieldTypes_0_" name="Stream2FieldTypes[0]"><option value="1">Text Area</option> 
    <option value="2">Text Box</option> 
    <option value="3">Rich Text</option> 
    <option value="4">Image</option> 
    <option value="5">DateTime</option> 
    <option value="6">Decimal</option> 
    <option value="7">Integer</option> 
</select> 
3 <!--FYI: current value--> 

Je suis complètement manquant pourquoi la vue ne rend pas html qui sélectionne 3 (texte enrichi).

Est-ce que vous voyez quelque chose qui ne va pas dans mon processus de pensée?

Répondre

1

Merci à @hunter et @John_Hartstock pour me pointer vers l'instance selectlist plutôt que de me concentrer sur la méthode DropDownListFor().

J'ai fini par résoudre le bogue en construisant la liste de sélection dans la vue au lieu du contrôle. Le contrôleur a été édité à ceci:

ViewData["FieldTypesList"] = genesisRepository.FieldTypes; 
// Returns IEnumerable of FieldTypes 

Changé en vue de ceci:

<%: Html.DropDownListFor(
      model => model.FieldTypeID, 
      new SelectList((IEnumerable<FieldTypes>)ViewData["FieldTypesList"], 
      "ftID", 
      "ftName", 
      Model.FieldTypeID)) 
%> 

Cela fonctionne parfaitement.

+1

Résolu un problème que j'avais, alors merci! :) –

1

Vous pouvez le manipuler dans votre contrôleur avec une surcharge du SelectList Constructor

ViewData["FieldTypesList"] = new SelectList(
     genesisRepository.FieldTypes, "ftID", "ftName" 
     new (ftID=3, ftName="Rich Text"); 
+0

Je ne pense pas pouvoir utiliser cette syntaxe. la vue que j'ai montrée ci-dessus fait en fait partie d'un modèle d'éditeur, et elle est affichée en utilisant EditorFor(). En fin de compte, il pourrait y avoir un certain nombre de ces boîtes de sélection "FieldType" sur la page. Cela dépend de l'enregistrement qui est appelé. Je ne peux pas coder en dur les valeurs de la liste de sélection dans le contrôleur car cette liste de sélection est sur la page plusieurs fois. – quakkels

2

Je pense que vous avez oublié de passer la valeur sélectionnée au constructeur

ViewData["FieldTypesList"] = new SelectList(
    genesisRepository.FieldTypes, "ftID", "ftName", myModel.FileTypeID) 
); 
+0

Lorsque je construis la liste de sélection, je ne sais pas encore quelle est la valeur sélectionnée. J'envoie un viewmodel à la vue et la même liste de sélection est utilisée pour plusieurs éléments dans le viewmodel. – quakkels

+0

En outre, je pensais que la ligne à mon avis: 'model => model.FieldTypeID' était censé spécifier la valeur de sélection. – quakkels

+0

essayez de convertir FieldTypeID en int. '(int) model.FieldTypeID' Je devine que c'est une énumération? – hunter

Questions connexes