如何在 Asp.Net MVC5 中使用 Ajax 将数据库更改保存到拖放列表

Posted

技术标签:

【中文标题】如何在 Asp.Net MVC5 中使用 Ajax 将数据库更改保存到拖放列表【英文标题】:How To Save Database Changes to Drag and Drop Lists with Ajax in Asp.Net MVC5 【发布时间】:2020-06-04 09:22:29 【问题描述】:

我正在尝试在我的应用程序部分实现 Dragula 拖放功能,以允许管理员将用户分配给某些角色。 .cshtml 已实现并正确显示,但我无法弄清楚如何编写 Ajax 调用,以便我可以将参数传递给控制器​​中的方法,该控制器使用辅助类来添加和删除。可以将参数传递到从它被丢弃的位置派生的ajax $.post(url) 中吗?下面应该包含所有相关代码。我也明白 Viewbags 不是做到这一点的最佳方式,但如果我能让它发挥作用,我将编写一个视图模型并通过这种方式传递数据。

.cshtml代码

其中有 4 个,一个用于 3 个可分配角色中的每一个,一个用于未分配到任何角色的角色。它们目前正在正确填充。

<div class="col-3 h-100">
    <div class="bg-secondary p-4">
        <h6 class="card-title">Developers</h6>
        <div id="dragula-developers" class="py-2">
            @foreach (var user in ViewBag.Developers)
            
                <div class="card rounded mb-2">
                    <div class="card-body p-3">
                        <div class="media">
                            <div class="media-body">
                                <h6 class="mb-1">@user.FirstName @user.LastName</h6>
                                <p class="mb-0 text-muted"> @user.Email </p>
                            </div>
                        </div>
                    </div>
                </div>
            

控制器方法

public JsonResult ManageRoles(string id, string role)
        
            var message = "User Not Assigned To Role";
            if (id != null)
            
                userRolesHelper.RemoveUserFromRole(id, role);
                    
                if (!string.IsNullOrEmpty(role))
                
                    userRolesHelper.AddUserToRole(id, role);
                    message = "User Assigned To Role Successfully!";
                
            
            return Json(message);
        

最后我相信我的 ajax 应该去的 Dragula 脚本的基本框架,在 .on('drop') 之后。

(function ($) 
            'use strict';
            dragula([document.getElementById("dragula-noRole"), document.getElementById("dragula-submitters"),
            document.getElementById("dragula-developers"), document.getElementById("dragula-managers")])
                .on('drop', function (el) 
                          console.log($(el));
                )
        )(jQuery);

有 4 个盒子,理想情况下,当用户的卡片被放入 Dragula 容器时,他们的 id 和与 Dragula 相关联的角色将被拍摄到帖子中,并且他们的角色将被更改,并返回一条消息。这不是一个会被大量使用的功能,所以我不应该需要 websockets,但我不知道如何实现它。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

经过比我愿意承认的时间更长的时间,我终于弄明白了。以防万一它在将来对其他人有所帮助,我不得不更改我的控制器以接受一个数组。在抽象之前它最终看起来像这样。

[HttpPost]
    public JsonResult ReassignToDev(Array userIds)
    
        var message = "";
        if (userIds == null)
        
            message = "No Users to Change Roles Of";
        

        if (userIds != null)
        
            foreach (var user in userIds)
             
                userRolesHelper.RemoveAllRoles(user.ToString());
                userRolesHelper.AddUserToRole(user.ToString(), "Developer");
                message = "Role Change Successful";
            
        

        return Json(message);
    

我的 ajax 调用最终看起来像这样:

 var developerIds = new Array();
        $('.developer .hidden').each(function (i) 
            developerIds.push($(this).text());
        )
        console.log(developerIds);
        $.ajax(
            type: "POST",
            url: '@Url.Action("ReassignToDev", "Admin")',
            dataType: 'JSON',
            data:  userIds: developerIds ,

            success: function (response) 
                alert(message);
            ,
            error: function (response) 
                alert(message);
            
        );

4 种不同的方法和 4 种不同的调用,通过触发 ajax 请求的按钮单击提交。我敢肯定,这不是最优雅的解决方案,但它既实用又快速。

【讨论】:

以上是关于如何在 Asp.Net MVC5 中使用 Ajax 将数据库更改保存到拖放列表的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC5 中传递给控制器​​时,DateTime 字段为空

如何使用trackerenableddbcontext在asp.net mvc5和代码中的实体框架中实现审计跟踪

ASP.NET MVC5 实现 SQL 查询工具

如何在 OWIN ASP.NET MVC5 中注销用户

如何在ASP.NET MVC5中正确包含jQuery与knockout.js

如何将 MVC5 RedirectResult () 重定向到 Asp.net 中的整页?