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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top