2010-06-28 3 views
1

J'ai un modèle de vue pour une entreprise. Ce modèle conatains un modèle de vue pour l'adresse, les détails de contact et également un IEnumerable. J'utilise des modèles d'éditeur pour afficher les cases à cocher. Le problème est quand je suis sur l'action d'édition et publie le formulaire les catégories reviennent comme nulles. J'ai lu quelques questions similaires, mais je n'ai pas trouvé une solution qui semble fonctionner.Pourquoi mes cases à cocher ne sont-elles pas liées à mon modèle View?

J'ai regardé dans les classeurs de modèle personnalisé sans succès et actuellement je pense que je ne montre pas les bonnes informations dans le modèle de l'éditeur. Je sais que les cases à cocher ont besoin d'une entrée cachée pour aller avec eux et peut-être que mon problème réside ici?

BusinessViewModel

public class BusinessViewModel 
    { 

     public int? Id { get; set; } 

     [UIHint("ContactDetailsEditorTemplate")] 
     public ContactDetailsViewModel ContactDetailsViewModel { get; set; } 

     [UIHint("CheckboxEditorTemplate")] 
     public IEnumerable<CheckboxViewModel> Categories { get; set; } 

    } 

CheckboxViewModel

public class CheckboxViewModel 
{ 
    public int CategoryId { get; set;} 
    public string Description { get; set;} 
    public bool Checked { get; set; } 
} 

CheckboxEditorTemplate

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<ViewModels.BuyWithConfidence.CheckboxViewModel>>" %> 
<table class="aligncenter"> 
    <tr class="tRow left"><% 
    var intBreakLine = 0; 
    if (Model != null) 
    { 
     foreach (var category in Model) 
    { 
    if (intBreakLine >= 2) 
    { 
     intBreakLine = 0;%> 
     </tr> 
     <tr class="tRow left"><% 
    }%> 
     <td>   
     <%= Html.Hidden(string.Format("Categories[{0}].CategoryID", i), category.CategoryId) %> 
     <%= Html.CheckBox(string.Format("Categories[{0}].Checked", i), category.Checked) %> 
     </td> 
     <td><%=category.Description%></td><% 
    intBreakLine = intBreakLine + 1; 
    i = i + 1; 
    } 
    }%>       
    </tr> 
</table> 

Ceci est un extrait de ce que le modèle est produit:

<input id="Categories_Categories_0__CategoryID" name="Categories.Categories[0].CategoryID" type="hidden" value="1" /> 
     <input id="Categories_Categories_0__Checked" name="Categories.Categories[0].Checked" type="checkbox" value="true" /><input name="Categories.Categories[0].Checked" type="hidden" value="false" /> 

Répondre

1

On dirait que vous finiriez avec 3 entrées toutes nommées comme CategoryId. Avez-vous envisagé d'utiliser l'astuce .index pour la liaison de collection. Ou, vous pouvez utiliser la notation array[].

<%= Html.Hidden("Categories.index", category.CategoryID) %> 
<%= Html.Hidden(string.Format("Categories[{0}].CategoryID", category.CategoryID), category.CategoryID) %> 
<%= Html.CheckBox(string.Format("Categories[{0}].Checked", category.CategoryID), category.Checked) %> 

Si l'ordre reste le même, vous pouvez utiliser for(int i...).

<%= Html.Hidden(string.Format("Categories[{0}].CategoryID", i), category.CategoryID) %> 
<%= Html.CheckBox(string.Format("Categories[{0}].Checked", i), category.Checked) %> 

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

+0

Je suis toujours obtenir nulle pour les trader.categories lorsque l'action post est touché. J'ai essayé à la fois ci-dessus et j'ai commencé à 0 – Andrew

+0

J'ai mis à jour la question avec le code HTML qu'il produit peut-être vous pouvez repérer quelque chose? – Andrew

+0

Le code HTML résultant doit être nommé 'Categories [69]. *'. Pourquoi est-ce 'Categories.Categories [69]. *'? Cela indiquerait au classeur de rechercher une propriété nommée Catégories qui possède une collection nommée Catégories. – dotjoe

Questions connexes