Asp MVC3 personnalisée EditorTemplate des collections (vide ou non)
-
10-10-2019 - |
Question
Après beaucoup de googler, stackoverflowing (?) Et un blog de lecture, je ne peux toujours pas résoudre complètement la question. Espérons que cette communauté d'experts peut venir à la rescousse!
Étant donné: Une classe de l'entreprise avec un ICollection sur le terrain (Une société peut avoir plusieurs adresses). Chaque adresse a quelques champs de chaîne simple.
Version courte:
Je veux que l'utilisateur soit en mesure d'ajouter un nombre d'adresses à la société. D'abord, je veux montrer un ensemble d'adresses textboxes puis un bouton « Ajouter une autre adresse ». Le Javascript est pas un problème, plutôt la partie mvc. Si peu claire, devrait être similair la fonctionnalité à ceci: http://www.mdelrosso.com/sheepit/index.php?lng = en_GB & s = demo3
Je dois utiliser la fonction MVC EditorForModel (), ce qui signifie que tous les besoins de configuration pour aller dans les modèles de l'éditeur.
Etat jusqu'à présent:
- Créé ViewModel pour la page modifier la société (CompanyViewModel)
- Ajout [UIHint ( "Adresses")] aux adresses ICollection public champ {get; ensemble; }
- Adresses créés EditorTemplate
Dans les adresses EditorTemplate, lors de l'ajout d'une nouvelle société, le modèle est passé dans Null (pas des surprises là-bas). Comment puis-je créer l'éditeur pour l'adresse supplémentaire? J'ai essayé plusieurs incarnations de (en utilisant Razor):
@Html.EditorFor(m => new Address());
mais aint capable de quoi que ce soit produit même en travaillant à distance. (La donne exacte ci-dessus ligne l'erreur « Modèles peut être utilisé uniquement avec accès terrain, accès à la propriété, l'indice de tableau à une dimension ou expressions indexeur personnalisée à un seul paramètre. »)
Merci pour tous les pointeurs!
/ Victor
La solution
Ceci est une lacune des API actuelles. Une façon vous pouvez le faire est d'avoir une action de l'enfant qui est responsable de la génération du formulaire d'insertion
Dans votre contrôleur:
[ChildActionOnly]
public ActionResult AddAddress() {
return View(new Address()); // pass an instance so view works
}
Ajouter une nouvelle vue AddAddress.cshtml
@model Address
@Html.EditorForModel()
Ensuite, dans l'utilisation du modèle de l'éditeur
@Html.Action("AddAddress")