2010-10-27 4 views
0

Je crée un MVC EditorTemplate pour le type de données booléen qui rendra une liste déroulante avec les options Vrai ou Faux, ET définira la valeur sélectionnée sur la valeur du modèle.en essayant de faire un MVC EditorTemplate pour un booléen qui rend un DDL avec Vrai ou Faux

Le rendu DDL n'est pas défini sur la valeur du modèle.

Qu'est-ce qui me manque ici?

Voici mon code de vue:

<%:Html.EditorFor(model => model.Association.Active, "Bool")%> 

Voici mon code de modèle:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<bool>" %> 
<% 
    string[] values = new string[2]; 
    values[0] = "True"; 
    values[1] = "False"; 
%> 
<div class="editor-row"> 
<div class="editor-label"> 
    <%= Html.LabelFor(model => model)%> 
</div> 
<div class="editor-field"> 
    <%= Html.DropDownListFor(model => model, new SelectList(values, Model))%> 
    <%= Html.ValidationMessageFor(model => model) %> 
</div> 
</div> 

J'embelli un peu le code de sorte que j'utilise REAL SelectListItems au lieu de chaînes. Mais cela ne fonctionne toujours pas. Maintenant, je reçois un DDL de deux chaînes qui disent "System.Web.MVC.SelectListItem" au lieu de "true" et "false". Pourquoi cela arrive-t-il ici?

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<bool>" %> 
<% 
    SelectListItem item1 = new SelectListItem(); 
    item1.Text = "True"; 
    item1.Value = "True"; 

    SelectListItem item2 = new SelectListItem(); 
    item2.Text = "False"; 
    item2.Value = "False"; 

    if (Model == true) 
    { 
     item1.Selected = true; 
     item2.Selected = false; 
    } 
    else 
    { 
     item1.Selected = false; 
     item2.Selected = true; 
    } 

    List<SelectListItem> items = new List<SelectListItem>(); 
    items.Add(item1); 
    items.Add(item2); 
%> 
<div class="editor-row"> 
<div class="editor-label"> 
    <%= Html.LabelFor(model => model)%> 
</div> 
<div class="editor-field"> 
    <%= Html.DropDownListFor(model => model, new SelectList(items))%> 
    <%= Html.ValidationMessageFor(model => model) %> 
</div> 
</div> 

Répondre

0

Le problème est que le paramètre du constructeur selectedValue de SelectList est à la recherche d'une instance exacte de object selectedValue dans la collection de valeur qui lui est passé. Dans votre cas, vous passez un string[] en tant que jeu de valeurs et un Boolean en tant qu'objet sélectionné et depuis aucun article correspondant à (bool)true != (string)"True" trouvé.

faire au lieu ceci:

<%= Html.DropDownListFor(model => model, new SelectList(values, Model.ToString()))%> 
+0

Nathan, l'esprit vous regardant le deuxième exemple de code I posté? La manière originale que j'ai écrite fonctionne avec votre correctif, mais il n'y a pas de valeur = "true" et value = "false" dans les balises

+0

@Blackcoil en HTML s'il n'y a pas d'attribut value sur un élément '

+0

J'ai compris, merci! – Blackcoil

0

Blackcoil - avez-vous essayé tordant la 1ère ligne à:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Boolean?>" %> 

probablement ne va pas aider, mais c'est comment mon EditorTemplate pour une case à cocher personnalisée est défini comme je m'attends à des types nullable.

1

code pour finalement travaillé:

public List<SelectListItem> YesNo()   
{ 

     SelectListItem item1 = new SelectListItem(); 
     item1.Text = "Yes"; 
     item1.Value = "True"; 
     SelectListItem item2 = new SelectListItem(); 
     item2.Text = "No"; 
     item2.Value = "False"; 
     List<SelectListItem> items = new List<SelectListItem>(); 
     items.Add(item1); 
     items.Add(item2); 
     return items; 
} 

En Vue:

@Html.DropDownListFor(model => model.CustomerAccess,new SelectList(
         new OrderProgression.Model.CommonList().YesNo(), 
         "Value","Text",Model.CustomerAccess.ToString())) 
Questions connexes