4 votes

ASP MVC Comment créer un éditeur pour un modèle qui a des éléments enfants ?

Je suis nouveau dans l'asp. Je dois écrire une application en mvc qui a une base de données où j'ai deux tables. Une table Parent est reliée une à plusieurs fois à la table Children.

Parent
-------------
parent_id
name

Children
-------------
children_id
parent_id (foreign key)
name

Lorsque l'utilisateur veut créer un élément pour la table Parent, l'éditeur doit avoir la possibilité d'ajouter (créer) des enfants.

Lorsque l'utilisateur modifie un parent, il doit avoir la possibilité de supprimer/éditer des enfants.

Il n'est pas possible d'ajouter/modifier/supprimer des enfants dans l'éditeur séparé.

Je pense que je devrais utiliser un javascript pour générer des contrôles supplémentaires pour Child. Je peux le faire mais je ne sais pas comment faire correspondre ces contrôles html au modèle ?

J'ai écrit ce point de vue :

<script language="javascript" type="text/javascript">
    function add_child() {
        $('#children').append($('<input name="child[' + ++$('#children>input').get().length + ']" />'));
    }
</script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Create Parent</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <div>Children:</div>
        <div id="children">
            @Html.TextBox("child[1]")
        </div>
        <div>
            <input onclick="add_child()" type="button" />
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Cela fonctionne bien. Mais je ne sais vraiment pas comment mapper cet élément sur mon modèle parent.

Maintenant, mon modèle pour créer la vue ressemble à ceci :

public class ParentModel {
    public ParentModel() {
        Children = //... get all children from database
    }

    public string Name { get; set; }
    // this should be an ids of selected children
    public string[] SelectedChildren { get; set; }
    // children to display
    public ICollection<ChildModel> Children { get; set; }

}

public class ChildModel {
    public string Name { get; set; }
}

Comment remplir ces enfants avec les valeurs de la vue ?

Contrôleur :

public class ParentController : Controller
{
        // show form
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index() {
            ParentModel model = new ParentModel();
            return View(model);
        }

        // Get Parent and Children
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(ParentModel form) {
            // I want to read a form.CreatedChildren
            // but it is Null
            return View();
        }

}

Je veux lire un form.CreatedChildren mais il est Null...

5voto

Darin Dimitrov Points 528142

Vous pouvez consulter le article de blog suivant . Et le suivi de sur la validation.

0voto

Steve Mallory Points 2713

Si je comprends bien votre modèle, vous avez besoin

// children to display
public ICollection<ChildModel> Children { get; set; }

dans votre modèle parent. Dans le constructeur de votre ParentModel

Children = new HashSet<ChildModel>();

Pour ce qui est de remplir le modèle avec des données, cela appartient à votre contrôleur. Quelque chose comme :

var parents = from p in context.ParentModels
              select p;
Return View(parents);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X