【问题标题】:Checkboxlist in asp mvcasp mvc中的复选框列表
【发布时间】:2012-11-27 23:11:25
【问题描述】:

我有 3 个表、项目、设备和 projectdevice(链接 2 个以实现多对多关系的表)。设备连接到账户,在账户管理中,设备可以连接到项目。我想通过使用复选框来做到这一点。创建或编辑项目时,应该有一个所有设备的列表以及选择它们的可能性。 换句话说,如何使用复选框填充 projectdevice 表?

我正在使用 ActiveRecord 访问我的数据

【问题讨论】:

  • 您使用什么数据访问方法? ADO.Net?奥姆?因为这将取决于您如何实现链接。正如一些 ORM 会为你做的那样。

标签: asp.net-mvc checkbox


【解决方案1】:

好吧,我认为这不会自动起作用,因此您必须自己构建网格,然后解析结果以重新保存它们。它实际上并没有那么难。我在下面为您编写了一个示例应用程序...

控制器:

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" } };
    }

}

设备型号:

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

项目模型:

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

LinkDeviceAndProject(查看模型):

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

查看:

<%@ 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>

【讨论】:

    【解决方案2】:

    我没有尝试过,我对活动记录的了解有限,但是我找到了this which might be of use

    HasAndBelongsToMany 似乎是你想要的。

    希望这会有所帮助。如果我错过了重点,请告诉我:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2010-11-13
      • 1970-01-01
      • 2016-10-09
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多