Comment puis-je modifier un IEnumerable avec ASP.NET MVC 3?
-
26-09-2019 - |
Question
Étant donné les types suivants
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 se fait? Comment les valeurs reviennent lié au modèle?
J'ai actuellement une forme affichant un champ de texte pour chaque valeur, mais ils ont tous le même nom et même identifiant. Ceci est évidemment pas valide HTML et empêchera MVC de cartographier les valeurs de retour.
La solution
Vous le ferait en utilisant l'Éditeur de modèles. De cette façon, le cadre se chargera de tout (de nommer correctement les champs d'entrée à la liaison correctement les valeurs dos dans l'action post).
Contrôleur:
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 (de ~/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>
Autres conseils
IList
met en œuvre IEnumerable donc vous pouvez 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 deux manières de le faire. Vous pouvez créer un cshtml de EditorFor
pour le modèle qui boucle permet de faire défiler votre liste de SomeValue
et de sortie ids appropriées et que non. Ensuite, dans votre mise en œuvre de votre ModelBinder
serait alors lire vos cartes d'identité et les lier de façon appropriée. Je peux poster un échantillon de travail dans un certain temps.