Come faccio a modificare un IEnumerable con ASP.NET MVC 3?
-
26-09-2019 - |
Domanda
Dati i seguenti tipi
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 campi di testo abituali per SomeProp1
e SomeProp2
e poi una tabella che contiene un campo di testo per ogni SomeValue
nella collezione SomeModel.MyData
.
Come si fa? In che modo i valori tornare legato 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 valida HTML e impedirà MVC dalla mappatura dei valori di nuovo.
Soluzione
Si potrebbe farlo utilizzando Editor modelli. In questo modo il quadro si prenderà cura di tutto (da nominare correttamente i campi di input correttamente vincolanti i valori indietro nell'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);
}
}
Visualizza (~/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>
Altri suggerimenti
implementa IEnumerable IList
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 cshtml EditorFor
per il modello cui ciclo volontà attraverso la vostra lista SomeValue
e di uscita ids appropriati e non quello. Poi, nell'implementazione ModelBinder
tuo sarebbe poi leggere gli ID e si legano in modo appropriato. Posso inviare un campione che lavora in un po '.