Wie bearbeite ich eine IEnumerable mit ASP.NET MVC 3?
-
26-09-2019 - |
Frage
In Anbetracht der folgenden Typen
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; }
}
Ich möchte eine Bearbeitungsformular für den Typ SomeModel
schaffen, die die üblichen Textfelder für SomeProp1
und SomeProp2
und dann eine Tabelle, die ein Textfeld für jede SomeValue
in der SomeModel.MyData
Sammlung enthalten würde.
Wie wird das gemacht? Wie unterscheiden sich die Werte an das Modell gebunden zurück?
Im Moment habe ich ein Formular für jeden Wert ein Textfeld angezeigt wird, aber sie alle haben die gleichen Namen und die gleiche ID. Dies ist natürlich nicht valides HTML und MVC verhindert, dass die Werte abbildet zurück.
Lösung
Sie würden es tun Editor Vorlagen. Auf diese Weise der Rahmen um alles kümmern wird (von richtig die Eingabefelder zu benennen, um richtig verbindlich die Werte in der Post Aktion zurück).
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);
}
}
Ansicht (~/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" />
<% } %>
Und schließlich die Editor-Vorlage (~/Views/Home/EditorTemplates/SomeValue.ascx
), die automatisch für jedes Element der MyData
Sammlung aufgerufen werden:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %>
<div>
<%= Html.TextBoxFor(x => x.Id) %>
<%= Html.TextBoxFor(x => x.Value) %>
</div>
Andere Tipps
IList
implementiert IEnumerable, so dass Sie Ihr Modell wie so ändern könnte:
public class SomeModel {
public string SomeProp1 { get; set; }
public string SomeProp2 { get; set; }
public IList<SomeValue> MyData { get; set; }
}
Sie können die IModelBinder
-Schnittstelle verwenden, um ein Bindemittel für Ihr spezifisches Modell zu erstellen. Es gibt ein paar Möglichkeiten, es zu tun. Sie können einen EditorFor
cshtml für das Modell, das wird Schleife durch Ihre SomeValue
und die auszugebenden entsprechende IDs erstellen und was nicht. Dann in Ihrer ModelBinder
Implementierung würden Sie dann durch Ihre ids lesen und binden Sie sie ordnungsgemäß. Ich kann eine Arbeitsprobe in einer Weile stellen.