【问题标题】:Ajax call not working in foreach loop in MVCAjax 调用在 MVC 中的 foreach 循环中不起作用
【发布时间】:2018-09-17 15:26:09
【问题描述】:

我正在使用 AJAX 向数据库动态添加数据,并在 MVC 中使用 foreach 循环显示它们,我还添加了一个按钮来使用 ajax 调用删除这些数据。

HTML/MVC 代码:

<div id="divaddrules" class="form-group row">
   @try
      {
         foreach (var item in ViewBag.AdditionalRules)
           {
             <div class="col-sm-10">
                <p style="font-size:large">@item.AdditionalDesc</p>
             </div>
             <div class="col-sm-2">
                <input type="button" onclick="Removeinput(@item.id)" class="text-dark" style="border:none; background-color:transparent" value="X" />
              </div>
            }
       }
       catch (Exception ex){ }

</div>

现在,当我点击删除按钮时,它会调用以下 JS 代码:

function Removeinput(id) {
        var datas = {};
            datas.addId = id
        $.ajax({
            url: "/Rooms/RemoveAdditionalRules",
            type: "GET",
            data: datas,
            success: function (result) {
               alert(result.id);
               $("#divaddrules").load(window.location.href + " #divaddrules");
            },
            error: function (result) {
                alert("Error: " + result.status);
           }
        });
}

并将其传递给此控制器:

[HttpGet]
[Authorize]
public ActionResult RemoveAdditionalRules(int addId)
{
     HouseRules rules = db.HouseRules.Find(addId);
     db.HouseRules.Remove(rules);
     db.SaveChanges();

     return Json(JsonRequestBehavior.AllowGet);
}

我在 ajax 调用错误时收到 500 错误。

谁能告诉我哪里做错了?请..我被困在这里了。

更新: 附截图:Debug Screenshot

【问题讨论】:

  • return Json(JsonRequestBehavior.AllowGet) => 实际上你没有返回任何 JSON 数据,这可能是你的 500 错误的原因。试试return Json(new { id = addId }, JsonRequestBehavior.AllowGet)
  • 你能打到服务器吗?
  • 我认为您已经创建了一个模型来传递数据,并且在行动中您已将其作为参数
  • @TetsuyaYamamoto 我试过了,还是一样的错误!
  • 尝试删除AuthorizeAttribute ([Authorize])。是否仍然出现相同的错误?有时在控制台中,AJAX 调用会返回解释错误的 HTML 标记。也可以试试data: { addId: id },

标签: ajax asp.net-mvc


【解决方案1】:

编写你的Removeinput函数如下:

function Removeinput(id) {
        $.ajax({
            url: "/Rooms/RemoveAdditionalRules",
            type: "GET",
            data: { addId : id},
            success: function (response) {
               alert(response);
               $("#divaddrules").load(window.location.href + " #divaddrules");
            },
            error: function (result) {
                alert("Error: " + result.status);
           }
        });
}

然后在控制器方法中:

[HttpGet]
[Authorize]
public ActionResult RemoveAdditionalRules(int addId)
{
     AdditionalRules rules = db.AdditionalRules.Find(addId); // Here was the problem. He was pointing to the wrong table that has fixed over team viewer.
     db.AdditionalRules.Remove(rules);
     db.SaveChanges();

     return Json(addId,JsonRequestBehavior.AllowGet);
}

【讨论】:

  • @GautamSharma 你调试好了吗? addId 值是否传递给控制器​​方法?
  • HouseRules rules = db.HouseRules.Find(addId) => 如果返回空结果(null),db.HouseRules.Remove(rules) 肯定会抛出参数异常,因为Remove 不接受 null 参数。
  • @GautamSharma 我已经更新了我的答案。检查Removeinput 方法和控制器方法。
  • @GautamSharma 你能分享团队查看器 ID 并通过吗?我正在解决你的问题!
  • 您使用的是什么版本?我的 uid:1063816751 并通过:1457
【解决方案2】:

问题是在 db 上缺少值,在您要求 id 25 但返回 null 的图像中,您尝试删除传递 null 值的项目。

所以在您的情况下,您需要在删除或修复丢失的数据之前进行验证:

[HttpGet]
[Authorize]
public ActionResult RemoveAdditionalRules(int addId)
{
     HouseRules rules = db.HouseRules.Find(addId);

If(rules == null)
{
  //return error msg.
  return Json(JsonRequestBehavior.AllowGet);
}
     db.HouseRules.Remove(rules);
     db.SaveChanges();

     return Json(JsonRequestBehavior.AllowGet);
}

【讨论】:

    【解决方案3】:

    让您的输入类型提交,这可能会有所帮助

    function deleterelation(id) {
        debugger;
        if (id > 0)
            $.ajax({
                url: "/Relations/Delete/" + id,
                type: "get",
                datatype: "json",
                data: { id: id },
                success: function (response) {
                    debugger;
                    if (response != null) {
                        
    
                        $("#txtDName").text(response.name);
                        $("#DRelationId").val(response.id);
                        $("#DeleteRelation").modal("show");
                    }
                },
                error: function (response) {
    
                    $("#DeleteRelationLoading").hide();
                    $("#DeleteRelation_btn_cancel").show();
                    $("#DeleteRelation_btn_save").show();
                }
            });
        else
            toastr.error("Something went wrong");
    }
    <input type="submit" onclick="Removeinput(@item.id)" class="text-dark" style="border:none; background-color:transparent" value="X" />
    

    如果这不起作用请告诉我

    【讨论】:

    • 这不是解决方案
    • 这可能是问题检查您的模型 id 和 Removeinput(@item.id) 是否相同
    • 你没有将你的 url 发送给 id use url: "/Relations/Delete/" + id, type: "get", datatype: "json", data: { id: id },
    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 2014-04-28
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多