2010-11-20 64 views
17

Étant donné les types suivantsComment éditer un IEnumerable <T> avec ASP.NET MVC 3?

public class SomeValue 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

public class SomeModel 
{ 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IEnumerable<SomeValue> MyData { get; set; } 
} 

Je veux créer un formulaire de modification du type SomeModel qui contiendrait les champs de texte habituels pour SomeProp1 et SomeProp2 puis une table contenant un champ de texte pour chaque SomeValue dans la collection SomeModel.MyData .

Comment cela est-il fait? Comment les valeurs sont-elles liées au modèle?

J'ai actuellement un formulaire affichant un champ de texte pour chaque valeur, mais ils ont tous le même nom et le même ID. Ce code HTML n'est évidemment pas valide et empêchera MVC de mapper les valeurs.

Répondre

14

Vous le feriez en utilisant les modèles d'éditeur. De cette façon, le framework s'occupera de tout (de nommer correctement les champs d'entrée pour lier correctement les valeurs dans l'action de publication).

Controller:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // In the GET action populate your model somehow 
     // and render the form so that the user can edit it 
     var model = new SomeModel 
     { 
      SomeProp1 = "prop1", 
      SomeProp2 = "prop1", 
      MyData = new[] 
      { 
       new SomeValue { Id = 1, Value = 123 }, 
       new SomeValue { Id = 2, Value = 456 }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SomeModel model) 
    { 
     // Here the model will be properly bound 
     // with the values that the user modified 
     // in the form so you could perform some action 
     return View(model); 
    } 
} 

Voir (~/Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %> 

    Prop1: <%= Html.TextBoxFor(x => x.SomeProp1) %><br/> 
    Prop2: <%= Html.TextBoxFor(x => x.SomeProp2) %><br/> 
    <%= Html.EditorFor(x => x.MyData) %><br/> 
    <input type="submit" value="OK" /> 
<% } %> 

Et enfin le modèle éditeur (~/Views/Home/EditorTemplates/SomeValue.ascx) qui sera appelé automatiquement pour chaque élément de la collection MyData:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %> 
<div> 
    <%= Html.TextBoxFor(x => x.Id) %> 
    <%= Html.TextBoxFor(x => x.Value) %> 
</div> 
+0

Heh, je suppose que je ne vais pas le poster maintenant parce que vous êtes la réponse est déjà mieux :) Je ne savais pas que vous pourriez lier les listes si facilement. Merci – Buildstarted

+2

pour MVC3 n'est-il pas préférable d'utiliser Razor? – arame3333

1

IList implémente IEnumerable pour que vous puissiez modifier votre modèle comme ceci:

public class SomeModel { 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IList<SomeValue> MyData { get; set; } 
} 

Vous pouvez utiliser l'interface IModelBinder pour créer un liant pour votre modèle spécifique. Il y a plusieurs façons de le faire. Vous pouvez créer un EditorFor cshtml pour le modèle qui passera en boucle dans votre liste SomeValue et affichera les identifiants appropriés et ce qui ne l'est pas. Ensuite, dans votre mise en œuvre ModelBinder votre serait alors lire vos identifiants et les lier de manière appropriée. Je peux poster un échantillon de travail dans un moment.

+0

Lorsque le formulaire est soumis, ViewEngin e prend soin de relier les données aux éléments corrects de la collection? –

+0

Vous savez ce qui est vraiment bizarre ... Je pourrais avoir ** juré ** cette question posée quelque chose de différent ... Je pense que je lisais deux questions en même temps et a répondu à la mauvaise ... Je vais changer ma réponse – Buildstarted