2012-03-26 19 views
-1

Ich versuche herauszufinden, wie man mit vielen zu vielen Beziehung arbeiten und haben dies mit einem Kontrollkästchen ausgewählt und dies mit EF4.1 aufgezeichnet. Und MVC3.Arbeiten mit vielen zu vielen Verknüpfung

zum Beispiel sagen ich habe zwei Entitäten:

Entity: Person * -Id -firstName -secondName

Entity: Ausrüstung * -Id -name -height -width

Die Verbindung zwischen der Entität Person und der Entität Ausrüstung ist viele zu viele.

Was ich auf der Seite zum Erstellen von Personen tun möchte, ich möchte den Inhalt der Equipment Entity/Tabelle als Kontrollkästchen anzeigen. Nach dem Abschicken des Formulars möchte ich die Personeneinheit erstellen und die ausgewählten Kontrollkästchen speichern.

Wenn jemand mir zeigen kann, wie ich das erreichen kann, wäre ich dankbar.

+2

[Was haben Sie versucht] (http://mattgemmell.com/2008/12/08/what-have-you-tried/)? –

+0

Hi, ja ich habe aber ich weiß nicht, wie man dynamische Checkboxen zurückliest. – user1012500

+0

Das beantwortet meine Frage nicht: Was hast du probiert? Wie sieht dein aktueller Code aus? Welche besonderen Schwierigkeiten haben Sie erlebt? –

Antwort

1

Es gibt ein paar Schritte.

  1. Definieren Sie Ihre entityies
  2. Konfigurieren eines ManyToManyRelationship
  3. die MVC contollers und Ansichten erstellen.

die Entity

definieren
public class Person 
{ 
    public int Id {get; set;} 

    /// other fields 

    public virtual ICollection<Equipment> Equipment { get; set; } 
} 

public class Equipment 
{ 
    public int Id {get; set;} 
    public string Name {get;set;} 

    /// other fields 

    public virtual ICollection<Person> People { get; set; } 
} 

Die DbContext Klasse

public MyContext : DBContext 
{ 
    DbSet<Person> People { get; set; } 
    DbSet<Equipment> Equipment {get; set;} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Person>() // configure the many to many relationship. 
      .HasMany(m=>m.Equipement) // not required but I like to be explicit 
      .WithMany(m=>m.People). 
      .Map(m=>m.MapLeftKey("Person_Id") 
        .MapRightKey("Equipement_Id) 
        .ToTable("PersonEquipment"); 
    } 
} 

Ich mag die Verwendung einer View-Modell public class CreatePersonViewModel { öffentliche Person Person {get Objekte per view ; set;} public IEnumerable Ausrüstung {get; set;} public int [] selectedEQuip ment {get; set;} // dies wird in der Post zurückkommen }

Der Controller

public class PersonController: Controller 
{ 
    public ActionResult CreatePerson() 
    { 
     using (var db = new MyContext()) 
     { 
      var newPerson = new CreatePersonViewModel 
        { 
         person = new Person(), 
         equipment = db.Equipement.ToList() 
        } 

      return View(newPerson) 
     } 
    } 
} 

The View

ich die gesamte Ansicht wird nicht tun, aber das ist ziemlich selbsterklärend. Es gibt viele Beispiele dafür auf dieser Seite. Der Schlüssel besteht darin, das Geräte-Array so einzurichten, dass Sie die Geräte-IDs zurückbekommen, wenn Sie sie benötigen. Ich werde ASPX für die Ansicht verwenden, aber Sie können Razor

<% 
    foreach (var e in Model.Equipement) 
    {%> 
     <input name="selectedEQuipment" type="checkbox" value=<%: e.Id %> /> 
     //// display the label for the checkbox anyway you want with whatever markup you need. 
    <%} 
%> 

... 

<input type="submit" /> 

Das Schlüssel-Stück ist, dass Sie alle Eingänge gleich ist und der Name Spiel nennen, was in dem Ansichtsmodell ist und dass all dies ist innerhalb einer Html.BeginForm(), einschließlich der Schaltfläche zum Senden.

Die Http Beitrag Metnod im Controller

[HttpPost] 
    public ActionResult CreatePerson(CreatePersonViewModel viewModel) 
    { 
     using (var db = new MyContext()) 
     { 
      // either use client side validation or server side validation 

      db.People.Add(viewModel.person); 
      // make sure the Equipment array in the viewModel is not null 
      var equipment = from o in db.Equipment where viewModel.selectedEquipment.Contains(o.Id); 
      foreach (var e in equipment) 
      { 
       viewModel.Equipment.Add(e); 
      } 

      db.SaveSchanges(); 
      // go somewhere using Redirect of some sort 
     } 
    } 
0

Ich mache einen Stich in der Dunkelheit. Sie suchen eine Lösung zu fragen, ohne Details, so hier die Bereitstellung geht ..

Es gibt viele Möglichkeiten, um die „Ich möchte zeigen, den Inhalt des Einrichtungsobjekt/Tabelle als Kontrollkästchen“

Einige der Optionen zu nähern sind Verwenden Sie eine Rasterkomponente und fügen Sie dem Raster als Auswahlfelder ein Kontrollkästchen hinzu. dann Schleife für jede Auswahl durch das Raster.

einfache Weise abfragen, um die Person ist, würde ich sagen, nur txtboxes verwenden und Felder binden dann das Gerät Gitter-Bindung (dies wird die zugehörige Ausrüstung Einzelteile erhalten.) Sie können eine Abfrage Methode, wie dies tun. Passing in id

dim q = from Equip in context.equipment 
     from Peeps in context.Person 
     where peeps.id = id 
     select Equip 

Sie werden dann durch die Ergebnisse in einer Schleife müssen und jedes Kontrollkästchen in der Komponente, die Sie die Abfrage unter Verwendung der oben

(Dies ist eine Technik, die ich verwende, es gibt auch andere) Wenn Sie Änderungen speichern möchten.

Personen zuerst speichern. dann Ich würde überprüfen, ob sich etwas im Grid geändert hat, wenn dies der Fall war, alle vorhandenen Datensätze in der Person betreffenden Ausrüstung abfragen und löschen (EF Clear Methode verwenden), dann loop thru equip grid für alle checked und zurück zu equimpment speichern . Dies wird alle Änderungen hinzufügen. Rebind Gitter.

Verwandte Themen