2012-09-09 4 views
1

Je suis this tutoriel. Quelqu'un peut-il m'expliquer comment je peux faire en sorte que les zones de texte soient liées au dictionnaire? En ce moment tout ce qui se passe est les données affichés dans les zones de texte - mais si je change les zones de texte, comment puis-je lier à l'objet? Qu'est-ce que je rate? Ci-dessous mon code:Dictionnaire de liaison MVC

<input type="text" name="@Model.ExpirimentToRemove[i].Value.Title" value="@Model.ExpirimentToRemove[i].Value.Title"/> 
<input type="text" name="@Model.ExpirimentToRemove[i].Value.PreviewDescription" value="@Model.ExpirimentToRemove[i].Value.PreviewDescription"/> 
<input type="text" name="@Model.ExpirimentToRemove[i].Value.FullDescription" value="@Model.ExpirimentToRemove[i].Value.FullDescription"/> 

Répondre

2

Le name de votre champ de saisie de texte est erroné. Vous avez mis la valeur du modèle au lieu de le nommer de manière appropriée, comme expliqué dans le blog du Hanselman.

Alors supposons que vous avez un modèle de vue:

public class ItemViewModel 
{ 
    public string Title { get; set; } 
    public string PreviewDescription { get; set; } 
    public string FullDescription { get; set; } 
} 

et un modèle de vue principal contenant le dictionnaire:

public class MyViewModel 
{ 
    public Dictionary<string, ItemViewModel> ExpirimentToRemove { get; set; } 
} 

et votre action du contrôleur POST prend ce modèle de vue en tant que paramètre:

[HttpPost] 
public ActionResult Remove(MyViewModel model) 
{ 
    ... 
} 

Afin de vous lier correctement à ce modèle de vue, vous pourriez avoir les éléments suivants:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @for (var i = 0; i < Model.ExpirimentToRemove.Count; i++) 
    { 
     <div> 
      @Html.TextBox(
       "ExpirimentToRemove[" + i + "].Key", 
       Model.ExpirimentToRemove[i].Key 
      ) 
      @Html.TextBox(
       "ExpirimentToRemove[" + i + "].Value.Title", 
       Model.ExpirimentToRemove[i].Value.Title 
      ) 
      @Html.TextBox(
       "ExpirimentToRemove[" + i + "].Value.PreviewDescription", 
       Model.ExpirimentToRemove[i].Value.PreviewDescription 
      ) 
      @Html.TextBox(
       "ExpirimentToRemove[" + i + "].Value.FullDescription", 
       Model.ExpirimentToRemove[i].Value.FullDescription 
      ) 
     </div> 
    } 

    <p><button type="submit">OK</button></p> 
} 

Dans cet exemple, la clé du dictionnaire est une valeur de chaîne, mais vous pouvez aussi utiliser un type complexe.

+0

J'ai essayé votre exemple. J'ai changé la clé en fonction de mon objet. Il affiche les données avec succès mais il n'enregistre pas les changements que je fais. Lorsque je clique sur Soumettre et que je survole mon objet au point de coupure, il contient des données qui étaient là à l'origine, avant que le View() ait été appelé en premier lieu. – Subby

+0

Où faites-vous ces changements? Dans l'action POST? Dans ce cas, vous devez effacer ModelState: 'ModelState.Clear();' avant de retourner la vue, sinon l'assistant TextBox utilisera la valeur initialement affichée. Une autre possibilité consiste simplement à coder en dur les entrées de texte au lieu d'utiliser l'assistant TextBox: ''. –

+0

@DarinDimitrov cela fonctionne bien pour le dictionnaire, mais comment puis-je obtenir la même chose avec List > en mvc. Les valeurs sont affichées dans la vue, mais quand elles sont affichées tous les champs sont null – Kayani