2010-10-05 10 views
1

J'ai 3 tables, projets, devices et projectdevice (table qui lie les 2 pour une relation many to many). Un appareil est connecté à un compte et dans la gestion de compte, l'appareil peut être connecté à un projet. Je veux le faire en utilisant des cases à cocher. Lors de la création ou de l'édition d'un projet, il devrait y avoir une liste de tous les appareils et la possibilité de les sélectionner. En d'autres termes, comment remplir la table projectdevice en utilisant des cases à cocher?Checkboxlist dans asp mvc

J'utilise ActiveRecord pour accéder à mes données

+0

Quelle méthode d'accès aux données que vous utilisez? ADO.Net? ORM? Comme cela dépendra de la façon dont vous implémentez le lien. Comme certains ORM le feront pour vous. – WestDiscGolf

+0

Mise à jour ma question – Prd

Répondre

3

Eh bien, je ne pense pas que cela fonctionnera automatiquement, donc vous devrez construire la grille vous-même, puis analyser les résultats pour les ré-persister. Ce n'est pas vraiment difficile. J'ai écrit un exemple d'application pour vous ci-dessous ...

Controller:

public class HomeController : Controller 
{ 

    [HttpGet] 
    public ActionResult Index() 
    { 
     LinkDeviceAndProject Model = new LinkDeviceAndProject(); 
     Model.Devices = GetDevices(); 
     Model.Projects = GetProjects(); 
     return View(Model); 
    } 

    [HttpPost] 
    public ActionResult Index(FormCollection SaveResults) 
    { 
     LinkDeviceAndProject Model = new LinkDeviceAndProject(); 
     Model.Devices = GetDevices(); 
     Model.Projects = GetProjects(); 

     foreach (var d in Model.Devices) 
     { 
      foreach (var p in Model.Projects) 
      { 
       string boxId = "d-" + d.Id.ToString() + "_p-" + p.Id.ToString(); 
       if (SaveResults[boxId] != null) 
       { 
        string box = SaveResults[boxId]; 
        bool boxValue = box == "true,false" ? true : false; 
        if (boxValue && d.Projects.Where(x => x.Id == p.Id).Count() == 0) 
         d.Projects.Add(p); 
        else if (!boxValue && d.Projects.Where(x => x.Id == p.Id).Count() > 0) 
         d.Projects.RemoveAll(x => x.Id == p.Id); 
       } 

      } 
     } 
     return View(Model); 
    } 

    private List<Device> GetDevices() 
    { 
     return new List<Device>() { new Device() { Id = 1, Name = "Device1" }, new Device() { Id = 2, Name = "Device2" } }; 
    } 

    private List<Project> GetProjects() 
    { 
     return new List<Project>() { new Project() { Id = 1, Name = "Project1" }, new Project() { Id = 2, Name = "Project2" } }; 
    } 

} 

Modèle de l'appareil:

public class Device 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<Project> Projects = new List<Project>(); 
    } 

Modèle de projet:

public class Project 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Device> Devices = new List<Device>(); 
} 

LinkDeviceAndProject (voir le modèle) :

public class LinkDeviceAndProject 
{ 
    public List<Project> Projects = new List<Project>(); 
    public List<Device> Devices = new List<Device>(); 
} 

Vue:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<testchecks.Models.LinkDeviceAndProject>" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Index</title> 
</head> 
<body> 
    <% using (Html.BeginForm()) 
     { %> 
    <div> 
     <table> 
      <tr> 
       <td></td> 
       <% foreach (var p in Model.Projects) 
        {%> 
        <td><%: p.Name%></td> 
       <%} %> 
      </tr> 

      <% foreach (var d in Model.Devices) 
       { %> 
       <tr> 
       <td><%: d.Name%></td> 
        <% foreach (var p in Model.Projects) 
         { %> 
         <td><%: Html.CheckBox("d-" + d.Id.ToString() + "_p-" + p.Id, d.Projects.Where(x => x.Id == p.Id).Count() > 0 ? true : false)%></td> 
        <%} %> 
       </tr> 
      <%} %> 
     </table> 
     <input type="submit" value="Save" /> 
    </div> 
    <%} %> 
</body> 
</html> 
1

Je n'ai pas essayé et ma connaissance du dossier actif est limité, mais j'ai trouvé this which might be of use

HasAndBelongsToMany semblent être ce que vous voulez.

Espérons que cela aide. Si j'ai manqué le point alors faites le moi savoir :-)