【问题标题】:How do I save List of Checkboxes with value as Id to a database?如何将值为 Id 的复选框列表保存到数据库中?
【发布时间】:2019-10-23 11:35:21
【问题描述】:

我有来自不同表的课程列表显示在同一视图上,如下所示

我希望用户通过选中复选框来选择他想要注册的课程。 如何获取所选课程的 ID,然后传递给控制器​​以保存到另一个表。

我的 HTML 代码是这样的

    @model FlexSchool.Data.Models.ClassModelIndex

                    <tbody>
                                            @foreach (var item in Model.AdmInstAssignCourses.Where(m => m.IsCompulsory == true))
                                            {
                                                <tr>
                                                    <td>
                                                        <input type="checkbox" class="checkBox" name="check" value="@item.AdmInstCourses.CourseId" />
                                                    </td>
                                                    <td>  @Html.DisplayFor(modelItem => item.AdmInstCourses.CourseCode) </td>
                                                    <td> @Html.DisplayFor(modelItem => item.AdmInstCourses.CourseName)</td>
                                                    <td> @Html.DisplayFor(modelItem => item.AdmInstCourses.Units)</td>

                                                </tr>
                                            }
                                        </tbody>

其中ClassModelIndexIEnumerable 的一个类,我用于显示要列出的不同表格。

我的按钮是这样&lt;input type="submit" value="Register Courses" id="register" class="btn btn-rose" /&gt;

我的脚本是这样的

    <script>
    $(document).ready(function () {

        $("#register").click(function () {
            var selectedIDs = [];
            $('input[type=checkbox]').each(function () {
                selectedIDs.push($(this).val());
            });
            $.ajax({

                url = "/Course/RegisterCourse",
                type = "POST",
                data = JSON.stringify({ courseIDs: selectedIDs }),
                contentType = "application/json; charset=utf-8",
                dataType = "json",
                success = function (data) {
                    alert(data);
                },
                error = function () {
                    alert("Error while registering courses!");
                },
            });
        });



</script>

我的Controller

    [HttpPost]
        public async Task<ActionResult> RegisterCourse(List<string> courseIDs)
        {

            var user = HttpContext.Session.GetString(InstName);
            if (user == null)
            {
                return RedirectToAction("Login", "Account");
            }

            foreach (string courseID in courseIDs)
            {
                AdmInstCourses obj = await _context.AdmInstCourses.FindAsync(courseID);
                var mycourses = new CourseRegModel { CourseCode = obj.CourseCode, CourseTitle = obj.CourseName, CourseUnit = obj.Units};
                _context.Add(mycourses);

            }
            await _context.SaveChangesAsync();
            return RedirectToAction("MyCourses", "Course");
        }

但是当我在调试模式下运行代码时,我注意到我的courseIDs 没有得到任何字符串列表作为 ID。因此,script 没有将复选框传递给控制器​​。

我到底做错了什么?

【问题讨论】:

    标签: javascript c# asp.net-core


    【解决方案1】:

    问题在于 JavaScript 代码。您错过了:checked。使用以下代码获取所有检查值。并确保input[type="checkbox"]:checked 之间没有空格。

    var selectedIDs = [];
    $('input[type="checkbox"]:checked').each(function () {
        // looping through each checkbox and storing values in array for checked ones.
        selectedIDs .push($(this).val());
    });
    

    【讨论】:

    • @Brainiac005 你至少得到一个值吗? (第一行的值)
    • 不,我没有得到任何值。javascript 不会通过其中指定的 Url 执行重定向到操作。单击按钮时,我使用&lt;form action&gt; 方法重定向到控制器中的操作。
    • 似乎 Ajax 调用存在问题。试试这个$.ajax({ url: '@Url.Action("RegisterCourse", "Course")', type: "POST", data = JSON.stringify({ 'courseIDs' : selectedIDs }), contentType : "application/json; charset=utf-8", dataType = "json", success : function (data) { alert(data); }, error : function () { alert("Error while registering courses!"); }, });
    • 谢谢,但是我已经能够通过使用这个var options = {}; options.url = "@Url.Action("RegisterCourse","Course")"; options.type = "POST"; options.data = JSON.stringify({ 'courseIDs': selectedIDs }); options.contentType = "application/json; charset=utf-8;"; options.dataType = "json", options.success = function () { alert("Registering Courses"); }; options.error = function () { alert("Error while Registering Courses"); }; $.ajax(options);我的 ajax 调用来工作,我现在唯一的挑战是在控制器中进行操作以获取来自 json 的字符串数组发布。
    • 是否将值添加到服务器端的数组中。您是否尝试在调用 Ajax 之前填充数组后添加alert(selectedIDs)var selectedIDs = []; $('input[type="checkbox"]:checked').each(function () { // looping through each checkbox and storing values in array for checked ones. selectedIDs .push($(this).val()); }); alert(selectedIDs);
    【解决方案2】:

    请尝试下面的 Ajax 代码:

    var selectedIDs = [];
    $('input[type=checkbox]').each(function () {
        selectedIDs.push($(this).val());
    });
    
    $.ajax({
            url : '/Course/RegisterCourse',
            type : "POST",
            data: JSON.stringify(selectedIDs),
            contentType : "application/json; charset=utf-8",
            dataType : "json",
            success : function (data) {
                alert(data);
            },
            error : function () {
                alert("Error while registering courses!");
            }
        });
    

    直接将json字符串(JSON.stringify(selectedIDs))传给服务器端,在控制器方法中,使用[FromBody]取值:

    [HttpPost]
    public async Task<ActionResult> RegisterCourse([FromBody]List<string> courseIDs)
    {
    
    
    }
    

    【讨论】:

      【解决方案3】:

      首先,你不能将 ids 放在复选框值中,因为复选框的值可以是真或假。

      尝试使用 html.HiddenFieldFor(model => model.YourModel[i]) 并将 foreach 替换为 for。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多