【问题标题】:How do I create a selection list using checkboxes in ASP.NET MVC?如何使用 ASP.NET MVC 中的复选框创建选择列表?
【发布时间】:2023-04-08 05:56:01
【问题描述】:

我有一个数据库表,其中记录了允许用户访问的出版物。该表非常简单 - 它只是存储用户 ID/发布 ID 对:

CREATE TABLE UserPublication (UserId INTEGER, PublicationID INTEGER)

给定用户和出版物的记录的存在意味着该用户具有访问权限;没有记录意味着无法访问。

我想向我的管理员用户展示一个简单的屏幕,让他们可以配置用户可以访问哪些出版物。我想为每个可能的出版物显示一个复选框,并检查用户当前可以访问的那些。然后管理员用户可以选中或取消选中任意数量的出版物并提交表单。

有多种出版物类型,我想将类型相似的出版物归为一组 - 所以我确实需要控制出版物的呈现方式(我不想只有一个平面列表)。

我的视图模型显然需要所有出版物的列表(因为无论当前选择如何,我都需要显示它们),并且我还需要用户当前有权访问的出版物的列表。 (我不确定是否最好使用单个列表,其中每个项目都包含发布 ID 和是/否字段?)。

但这就是我所知道的。我真的不知道如何将其绑定到某些复选框。我从哪里开始?

【问题讨论】:

    标签: asp.net-mvc data-binding asp.net-mvc-2 viewmodel


    【解决方案1】:

    您的问题的 Linq to SQL 模型如下所示:

    首先,我们的数据模型中需要一些帮助对象

    namespace SelectProject.Models
    {
        public class UserPublicationSelector
        {
            public int UserPublicationID { get; set; }
            public int UserID { get; set; }
            public int PublicationID { get; set; }
            public string PublicationName { get; set; }
            public bool IsSelected { get; set; }
        }
    
        public class UserPublicationSelectViewModel
        {
            public User User { get; set; }
            public IQueryable Selections { get; set; }
        }
    }
    

    现在让我们创建一个如下所示的存储库

    public class Repository
    {
        DataContext dc = new DataContext();
    
        public User GetUser(int userID)
        {
            return dc.Users.FirstOrDefault(u => u.UserID == userID);
        }
    
        public IQueryable GetUserPublications(int userID)
        {
            return from p in dc.Publications
                   join up in dc.UserPublications on p.PublicationID equals up.PublicationID
                   where up.UserID == userID
                   orderby p.PublicationName
                   select p;
        }
        public IQueryable GetUserPublicationSelectors(int userID)
        {
            return from p in dc.Publications
                   join up in dc.UserPublications on p.PublicationID equals up.PublicationID into selected
                   from s in selected.DefaultIfEmpty()
                   orderby p.PublicationName
                   select new UserPublicationSelector
                   {
                       UserPublicationID = (int?)s.UserPublicationID ?? 0,
                       UserID = userID,
                       PublicationID = p.PublicationID,
                       PublicationName = p.PublicationName,
                       IsSelected = s.UserID != null
                   };
        }
    
        public void UpdateUserPublications(UserPublicationSelector[] selections)
        {
            // Insert records for new selections...
            foreach (UserPublicationSelector selection in selections.Where(s => s.IsSelected == true))
            {
                // ...where records do not yet exist in database.
                if (selection.UserPublicationID == 0)
                {
                    UserPublication up = new UserPublication
                    {
                        UserID = selection.UserID,
                        PublicationID = selection.PublicationID,
                    };
                    dc.UserPublications.InsertOnSubmit(up);
                }
            }
            // Delete records for unselected items...
            foreach (UserPublicationSelector selection in selections.Where(s => s.IsSelected == false))
            {
                // ...where record exists in database.
                if (selection.UserPublicationID > 0)
                {
                    UserPublication up = dc.UserPublications.FirstOrDefault(s => s.UserPublicationID == selection.UserPublicationID);
                    if (up.UserID == selection.UserID && up.PublicationID == selection.PublicationID)
                        dc.UserPublications.DeleteOnSubmit(up);
                }
            }
            // Update the database
            dc.SubmitChanges();
        }
    }
    

    还有一个如下所示的控制器

    public class PublicationController : Controller
    {
        Repository repository = new Repository();
    
        public ActionResult Index(int id)
        {
            User user = repository.GetUser(id);
            var publications = repository.GetUserPublications(id);
            ViewData["UserName"] = user.UserName;
            ViewData["UserID"] = user.UserID;
            return View("Index", publications);
        }
    
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Select(int id)
        {
            var viewModel = new UserPublicationSelectViewModel()
            {
                User = repository.GetUser(id),
                Selections = repository.GetUserPublicationSelectors(id)
            };
            return View("Select", viewModel);
        }
    
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Select(int userID, UserPublicationSelector[] selections)
        {
            repository.UpdateUserPublications(selections);
            return RedirectToAction("Index", new { id = userID });
        }
    }
    

    索引视图如下所示:

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Publication>>" %>
    <%@ Import Namespace="SelectProject.Models" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        List of Selected Publications for User
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    
        <h2>Publications for <%= ViewData["UserName"] %></h2>
    
            <table id="MyTable" style="width: 100%">
                <thead>
                    <tr>
                        <th>
                            Publication Name
                        </th>
                    </tr>
                </thead>
    
                <tbody>
                    <%  int i = 0;
                        foreach (Publication item in Model)
                        { %>
    
                        <tr id="row<%= i.ToString() %>">
                            <td>
                                <%= Html.Encode(item.PublicationName)%>
                            </td>
                        </tr>
    
                        <% i++;
                        } %>
                </tbody>
            </table>
            <p>
                <%= Html.ActionLink("Edit Selections", "Select", new { id = ViewData["UserID"] })%>
            </p> 
    
    </asp:Content>
    

    选择视图如下所示:

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UserPublicationSelectViewModel>" %>
    <%@ Import Namespace="SelectProject.Models" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        Select Publications
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    
        <h2>Select Publications for <%= Model.User.UserName %></h2>
    
        <% using (Html.BeginForm())
           { %>
    
            <table id="MyTable" style="width: 100%">
                <thead>
                    <tr>
                        <th style="width: 50px; text-align:center">
                            <input type="checkbox" id="SelectAll" />
                        </th>
                        <th>
                            Publication Name
                        </th>
                    </tr>
                </thead>
    
                <tbody>
                    <%  int i = 0;
                        foreach (UserPublicationSelector item in Model.Selections)
                        { %>
    
                        <tr id="row<%= i.ToString() %>">
                            <td align="center" style="padding: 0 0 0 0">
                                <%= Html.CheckBox("selections[" + i.ToString() + "].IsSelected", item.IsSelected)%>
                                <%= Html.Hidden("selections[" + i.ToString() + "].UserPublicationID", item.UserPublicationID)%>
                                <%= Html.Hidden("selections[" + i.ToString() + "].UserID", Model.User.UserID)%>
                                <%= Html.Hidden("selections[" + i.ToString() + "].PublicationID", item.PublicationID)%>
                            </td>
                            <td>
                                <%= Html.Encode(item.PublicationName)%>
                            </td>
                        </tr>
    
                        <% i++;
                        } %>
                </tbody>
            </table>
            <p>
                <%= Html.Hidden("userID", Model.User.UserID) %>
                <input type="submit" value="save" />
            </p> 
    
        <% } // End Form %>
    
        <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    
        <script type="text/javascript">
            // Select All Checkboxes
            $(document).ready(function() {
                $('#SelectAll').click(function() {
                    var newValue = this.checked;
                    $('input:checkbox').not('input:hidden').each(function() {
                        this.checked = newValue;
                    });
                });
            });
        </script>
    
    </asp:Content>
    

    这里有一些屏幕截图。

    左上角的复选框是一个全选/全选复选框。

    【讨论】:

    • 很棒的答案,谢谢。我觉得有点脏,就像我付钱给你做作业一样:-)
    • 您好罗伯特,深度回答非常好!谢谢您.. 我将如何发回(保存)选中值的复选框?
    • @TonyP:该功能位于 Select 视图、带有“AcceptVerbs HttpVerbs.Post”属性值的 Select 控制器方法和 UpdateUserPublications 存储库方法中,如上图所示。
    • 在您的GetUserPublicationSelectors(int userID) 函数中,IsSelected = s.UserId != null 将始终为真。是这样吗?
    • @Shawn:不。那个布尔表达式引用了 UserPublications 表中的一个字段,该字段被左连接到 Publications 表。因此,如果 UserPublications 表中不存在具有对应 PublicationID 的记录,则 s.UserID 将是 null
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多