2009-04-02 9 views
23

Est-ce que quelqu'un connaît des exemples ou des tutoriels d'une vue MVC qui affiche les données parent/enfant sur un seul formulaire et permet à tous les enregistrements enfants d'être modifiables? Par exemple, disons que j'ai une table de personnes et une autre contenant les véhicules qu'elles possèdent. Une forme, je veux montrer chaque véhicule pour une personne donnée, et rendre les éléments de données éditables (c.-à-d. Numéro d'immatriculation, couleur de voiture, etc.) en cas d'erreurs. Je ne veux pas passer à un formulaire d'édition distinct pour chaque véhicule.Exemple ASP.NET MVC de modification de plusieurs enregistrements enfants

Mes tentatives jusqu'à présent m'ont amené au point où je peux afficher les données, mais je ne peux pas l'obtenir à poster sur le contrôleur. J'ai essayé d'affiner le problème aussi loin que je pouvais here, mais je ne comprends toujours pas, et je pense qu'un exemple plus large peut être dans l'ordre. Des idées?

Répondre

27

Vous pouvez essayer quelque chose comme ça.

Supposons que vous ayez cet objet:

public class Vehicle 
{ 
    public int VehicleID { get; set; } 
    public string LicencePlate { get; set; } 
    public string Color { get; set; } 
} 

Et ceci est votre action du contrôleur que vous allez utiliser pour modifier les détails du véhicule (où vous postez le formulaire):

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditVehicles(int Owner, Vehicle[] vehicles) 
{ 
    //manipulate the data, then return back to the list 
    return RedirectToAction("YourAction"); 
} 

Ensuite, vous devez définir votre formulaire de cette façon:

<!--have a form for each person, listing their vehicles--> 
<form action="/EditVehicles" method="post"> 
    <input type="hidden" name="Owner" value="25" /> 
    <input type="hidden" name="Vehicles[0].VehicleID" value="10" /> 
    <input type="text" name="Vehicles[0].LicencePlate" value="111-111" /> 
    <input type="text" name="Vehicles[0].Color" value="Red" /> 
    <input type="hidden" name="Vehicles[1].VehicleID" value="20" /> 
    <input type="text" name="Vehicles[1].LicencePlate" value="222-222" /> 
    <input type="text" name="Vehicles[1].Color" value="Blue" /> 
    <input type="submit" value="Edit" /> 
</form> 

Cela aidera le DefaultModelBinder à lier correctement les données de formulaire à votre modèle dans votre contrôleur. Ainsi Response.Write(vehicles[1].Color); sur votre contrôleur, imprimera "Bleu".

Ceci est un exemple très simple, mais je suis sûr que vous avez l'idée. Pour plus d'exemples sur la liaison de formes à des tableaux, listes, collections, dictionnaires, jetez un oeil à here.

+0

MERCI! C'est exactement ce que je cherchais, et l'article de Hanselman était parfait. – gfrizzle

+0

Vous êtes les bienvenus :) –

+0

Cela fonctionne très bien lors d'un POST à ​​mon/Create URL, mais ne se lie pas aux données existantes lors d'un GET sur l'URL/Modifier. Mes deux pages Create et Edit utilisent la même vue partielle et utilisent donc le même modèle fortement typé. Des idées pourquoi? – JMS

0

Je pense que le mieux que vous pouvez contourner c'est en utilisant les messages AJAX, Chaque fois que l'utilisateur clique sur le bouton soumettre, vous pouvez accrocher dans cet événement, créer un tableau JSON des choses que vous voulez persister et envoyer . L'autre moyen consiste bien sûr à obtenir toutes les informations de l'objet "FormCollection" dans l'action POST. Vous avez juste besoin d'itérer à travers toutes les clés analyser les données et ensuite le traiter.

Questions connexes