【问题标题】:Problem with jquery script in cshtml (.NET MVC5)cshtml(.NET MVC5)中的jquery脚本问题
【发布时间】:2022-01-03 04:07:44
【问题描述】:

我的 jquery 脚本有问题(我刚开始学习 jQuery)。

每次我通过单击 SaveWorkout 按钮保存锻炼时,锻炼数组中发送的数据都会以某种方式成倍增加。 例如,我用一项运动保存了 2 次锻炼,然后当我想用一项运动保存第三次锻炼时,3 个相同的运动被发送到数组中(cshtml 中的表格 - #detailsTable)。 此外,例如当我用一个练习保存了 2 个锻炼时,当我想用​​两个练习保存第三个锻炼时,同样的 3 个练习乘以 2,总共发送了 6 个练习。 我试图以某种方式使用 remove () 或 empty () 清除表格,但这没有帮助。

问题可能出在哪里?

感谢大家的帮助

下面我附上了我的cshtml和控制器。

<script>
    //Show Modal.
    function addNewOWorkout() {
        $("#newWorkoutModal").modal();
    }
    //Add Multiple Exercise.
    $("#addToList").click(function (e) {
        e.preventDefault();

        if ($.trim($("#exerciseName").val()) == "" || $.trim($("#numberOfRepetitions").val()) == "" || $.trim($("#weight").val()) == "") return;

        var exerciseName = $("#exerciseName").val(),
            numberOfRepetitions = $("#numberOfRepetitions").val(),
            weight = $("#weight").val(),
            detailsTableBody = $("#detailsTable tbody");

        var exerciseItem = '<tr><td>' + exerciseName + '</td><td>' + numberOfRepetitions + '</td><td>' + weight + '</td></tr>';
        detailsTableBody.append(exerciseItem);            
        clearItem();
    });
    //After Add A New Order In The List, Clear Clean The Form For Add More Order.
    function clearItem() {
        $("#exerciseName").val('');
        $("#numberOfRepetitions").val('');
        $("#weight").val('');
    }
    // After Add A New Order In The List, If You Want, You Can Remove It.
    $(document).on('click', 'a.deleteItem', function (e) {
        e.preventDefault();
        var $self = $(this);
        if ($(this).attr('data-itemId') == "0") {
            $(this).parents('tr').css("background-color", "#ff6347").fadeOut(800, function () {
                $(this).remove();
            });
        }
    });
    //After Click Save Button Pass All Data View To Controller For Save Database
    function saveWorkout(data) {
        return $.ajax({
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            type: 'POST',
            url: "/Workout/SaveWorkout",
            data: data,
            success: function (result) {
                alert(result);
                location.reload();
            },
            error: function () {
                alert("Błąd!")
            }
        });
    }
    //Collect Multiple Order List For Pass To Controller
    $("#saveWorkout").click(function (e) {
        e.preventDefault();

        var workoutArr = [];
        workoutArr.length = 0;            
        
        $.each($("#detailsTable tbody tr"), function () {
            workoutArr.push({
                Name: $(this).find('td:eq(0)').html(),
                RepetitionsNumber: $(this).find('td:eq(1)').html(),
                weight: $(this).find('td:eq(2)').html()
            });
        });

        var data = JSON.stringify({
            workoutName: $("#workoutName").val(),
            exercises: workoutArr
        });

        

        $.when(saveWorkout(data)).then(function (response) {
            console.log(response);
        }).fail(function (err) {
            console.log(err);
        });


    });
</script>

<div class="modal fade" id="newWorkoutModal">
                            <div class="modal-dialog modal-lg">
                                <div class="modal-content">
                                    <div class="modal-header">                                          
                                        <h4>Dodaj nowy trening</h4>
                                    </div>
                                    <form id="NewWorkoutForm">
                                        <div class="modal-body">
                                            <h5 style="color:#ff6347">Szczegóły treningu</h5>
                                            <hr />
                                            <div class="row">
                                                <input type="hidden" id="WorkoutID" />
                                                <div class="col-12">
                                                    <label class="control-label pb-2">
                                                        Nazwa treningu
                                                    </label>
                                                    <div class="col-lg-7 col-md-10">
                                                        <input type="text" id="workoutName" name="workoutName" placeholder="" class="form-control" />
                                                    </div>
                                                </div>
                                            </div>
                                            <h5 style="margin-top:10px;color:#ff6347">Szczegóły ćwiczenia</h5>
                                            <hr />
                                            <div class="form-horizontal">
                                                @*<input type="hidden" id="OrderId" />*@
                                                <div class="row">
                                                    <input type="hidden" id="ExerciseID" />
                                                    <div class="col-lg-7 col-md-10">
                                                        <label class="control-label pb-2">
                                                            Nazwa ćwiczenia
                                                        </label>
                                                        <input type="text" id="exerciseName" name="exerciseName" placeholder="" class="form-control" />
                                                    </div>
                                                    <div class="col-lg-3 col-md-4">
                                                        <label class="control-label pb-2">
                                                            Liczba powtórzeń
                                                        </label>
                                                        <input type="text" id="numberOfRepetitions" name="numberOfRepetitions" placeholder="" class="form-control" />
                                                    </div>
                                                    <div class="col-lg-2 col-md-4">
                                                        <label class="control-label pb-2">
                                                            Ciężar (kg)
                                                        </label>
                                                        <input type="text" id="weight" name="weight" placeholder="" class="form-control" />
                                                    </div>
                                                </div>
                                                <div class="row pt-3 pb-3">
                                                    <div class="col-md-4 col-lg-offset-4">
                                                        <a id="addToList" class="btn btn-sm btn-primary">Dodaj do listy</a>
                                                    </div>
                                                </div>
                                                <table id="detailsTable" class="table">
                                                    <thead>
                                                        <tr>
                                                            <th style="width:40%">Nazwa ćwiczenia</th>
                                                            <th style="width:15%">Liczba powtórzeń</th>
                                                            <th style="width:15%">Ciężar</th>
                                                        </tr>
                                                    </thead>
                                                    <tbody></tbody>
                                                </table>
                                            </div>
                                        </div>
                                        <div class="modal-footer">
                                            <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Zamknij</button>
                                            <button id="saveWorkout" type="submit" class="btn btn-success">Zapisz trening</button>
                                        </div>
                                    </form>
                                </div>
                            </div>
                        </div>

控制器中的方法:

 public ActionResult SaveWorkout(string workoutName, Exercise[] exercises)
    {
        string result = "Błąd!";

        var userId = User.Identity.GetUserId();

        if (workoutName != null || exercises != null)
        {
            Workout newWorkout = new Workout()
            {
                Name = workoutName,
                CreateDate = DateTime.Now,
                UserId = userId
            };
            db.Workouts.Add(newWorkout);
            db.SaveChanges();

            var workoutId = db.Workouts.OrderByDescending(w => w.WorkoutID).Select(r => r.WorkoutID).FirstOrDefault();
            foreach (var exercise in exercises)
            {
                Exercise newExercise = new Exercise()
                {
                    Name = exercise.Name,
                    RepetitionsNumber = exercise.RepetitionsNumber,
                    Weight = exercise.Weight,
                    WorkoutID = workoutId

                };
                db.Exercises.Add(newExercise);
                
            }
            db.SaveChanges();
            result = "Sukces!";
        }
        return Json(result, JsonRequestBehavior.AllowGet);
    }

【问题讨论】:

  • 你调用 SaveChanges 两次。
  • 在后端你总是添加新的锻炼对象,你永远不会更新现有的。
  • 是的,我知道。我不想更新我的训练。我想创建新的并在其中保存新的练习。但是每次我在 javascript 代码中将练习添加到列表中时,练习都会以某种方式成倍增加。例如,当我只向列表中添加一个练习时(在 javasript 代码中它是“workoutArr”变量,在后面是“练习”变量),多个练习被发送到控制器,例如两个相同的练习,尽管我只在列表中添加了一个。
  • *在后端是“练习”变量

标签: javascript c# jquery .net asp.net-mvc


【解决方案1】:

您正在调用 db.SaveChanges 两次。

 public ActionResult SaveWorkout(string workoutName, Exercise[] exercises)
    {
        string result = "Błąd!";

        var userId = User.Identity.GetUserId();

        if (workoutName != null || exercises != null)
        {
            Workout newWorkout = new Workout()
            {
                Name = workoutName,
                CreateDate = DateTime.Now,
                UserId = userId
            };
            db.Workouts.Add(newWorkout);
           // db.SaveChanges(); -- no need

            var workoutId = db.Workouts.OrderByDescending(w => w.WorkoutID).Select(r => r.WorkoutID).FirstOrDefault();
            foreach (var exercise in exercises)
            {
                Exercise newExercise = new Exercise()
                {
                    Name = exercise.Name,
                    RepetitionsNumber = exercise.RepetitionsNumber,
                    Weight = exercise.Weight,
                    WorkoutID = workoutId

                };
                db.Exercises.Add(newExercise);
                
            }
            db.SaveChanges();
            result = "Sukces!";
        }
        return Json(result, JsonRequestBehavior.AllowGet);
    }

【讨论】:

  • 感谢您的回复。我必须调用 db.SaveChanges() 两次。首先,我必须创建新的锻炼,因为我必须创建 ID 新锻炼,然后将数组“练习”中的锻炼分配给他。问题在于数组“练习”(方法参数),因为在这个变量中是乘法练习。例如,当我只向列表中添加一个练习时(在 javasript 代码中它是“workoutArr”变量,而在后端它是“练习”变量),多个练习被发送到控制器,例如两个相同的练习,尽管我只在列表中添加了一个。
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多