2010-11-20 7 views
17

Dati i seguenti tipiCome posso modificare un IEnumerable <T> con 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; } 
} 

Voglio creare un modulo di modifica per il tipo SomeModel che conterrebbe i soliti campi di testo per SomeProp1 e SomeProp2 e poi una tabella che contiene un campo di testo per ogni SomeValue nella collezione SomeModel.MyData .

Come è fatto? Come si rimettono i valori al modello?

Al momento ho un modulo di visualizzazione di un campo di testo per ogni valore, ma tutti hanno lo stesso nome e lo stesso ID. Questo ovviamente non è un codice HTML valido e impedirà a MVC di mappare i valori.

risposta

14

lo fareste usando Editor modelli. In questo modo il framework si prenderà cura di tutto (dal nome appropriato dei campi di input per legare correttamente i valori indietro all'azione post).

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); 
    } 
} 

View (~/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" /> 
<% } %> 

E infine il Template Editor (~/Views/Home/EditorTemplates/SomeValue.ascx), che verrà richiamato automaticamente per ogni elemento della collezione 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, immagino che non lo posterò ora perché la tua risposta è già migliore :) Non sapevo che potessi associare liste che però facilmente. Grazie – Buildstarted

+2

per MVC3 non è meglio usare Razor? – arame3333

1

IList implementa IEnumerable così si potrebbe modificare il vostro modello in questo modo:

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

È possibile utilizzare l'interfaccia IModelBinder per creare un raccoglitore per il modello specifico. Ci sono un paio di modi per farlo. È possibile creare un EditorFor cshtml per il modello che andrà in loop attraverso la vostra lista SomeValue e di uscita ids appropriati e cosa no. Poi, nel vostro ModelBinder implementazione tuo sarebbe poi leggere gli ID e legatela in modo appropriato. Posso postare un campione funzionante per un po '.

+0

quando il modulo viene inviato, sarà il ViewEngin e prendersi cura di legare i dati agli elementi corretti della Collezione? –

+0

Sai cosa è veramente strano ... Potrei avere ** giurato ** questa domanda ha chiesto qualcosa di diverso ... Penso che stavo leggendo due domande contemporaneamente e ho risposto a quello sbagliato ... Sto andando a cambia la mia risposta – Buildstarted

Problemi correlati