控制器动作找不到JSON和ASP.净MVC

本文关键字:ASP MVC JSON 找不到 控制器 | 更新日期: 2023-09-27 18:06:17

嗨,我有这个控制器方法

  [HttpPost]
  public JsonResult CalculateAndSaveToDB(BMICalculation CalculateModel)
    {
        if (ModelState.IsValid)
        {
            CalculateModel.Id = User.Identity.GetUserId();
            CalculateModel.Date = System.DateTime.Now;
            CalculateModel.BMICalc = CalculateModel.CalculateMyBMI(CalculateModel.Weight, CalculateModel.Height);
            CalculateModel.BMIMeaning = CalculateModel.BMIInfo(CalculateModel.BMICalc);
            db.BMICalculations.Add(CalculateModel);
            db.SaveChanges();
        }
        var data = new
        {
            CalculatedBMI = CalculateModel.BMICalc,
            CalculatedBMIMeaning = CalculateModel.BMIMeaning
        };
        return Json(data, JsonRequestBehavior.AllowGet);
    }
这是我的JS函数:
 $('#good').click(function () {
    var request = new BMICalculation();
    $.ajax({
        url: "CalculateAndSaveToDB",
        dataType: 'json',
        contentType: "application/json",
        type: "POST",
        data: JSON.stringify(request), //Ahhh, much better
        success: function (response) {
            $("#result").text(response.result);
        },
    });
    ShowBMI();
});

function ShowBMI() {
    $.ajax({
        type: "GET",
        dataType: "json",
        contentType: "application/json",
        url: "CalculateAndSaveToDB",
        success: function (data) {
            var div = $('#ajaxDiv');
            div.html("<br/> " + "<b>" + "Your BMI Calculations: " + "</b>");
            printBMI(div, data);
        }
    });
};

当ShowBMI()执行时,Chrome显示GET http://localhost:50279/BMICalculations/CalculateAndSaveToDB/0 404 (Not Found)POST工作,因为它保存到数据库等,但GET没有?这有什么原因吗?正如你所看到的url是完全相同的,在每个JS函数,所以我不知道为什么它发现一次坚果不再次第二次?

更新:

分隔逻辑后,出现在网页上的值都为null。查看下面的代码修改

   [HttpPost]
    public JsonResult CalculateAndSaveToDB(BMICalculation CalculateModel)
    {
        if (ModelState.IsValid)
        {
            CalculateModel.Id = User.Identity.GetUserId();
            CalculateModel.Date = System.DateTime.Now;
            CalculateModel.BMICalc = CalculateModel.CalculateMyBMI(CalculateModel.Weight, CalculateModel.Height);
            CalculateModel.BMIMeaning = CalculateModel.BMIInfo(CalculateModel.BMICalc);
            db.BMICalculations.Add(CalculateModel);
            db.SaveChanges();
        }
        CalculateAndSaveToDB(CalculateModel.BMICalc.ToString(), CalculateModel.BMIMeaning.ToString());
        return Json("", JsonRequestBehavior.AllowGet);
    }

    [HttpGet]
    public JsonResult CalculateAndSaveToDB(string o, string t)
    {
        var data = new
        {
            CalculatedBMI = o,
            CalculatedBMIMeaning = t
        };
        return Json(data, JsonRequestBehavior.AllowGet);
    }

控制器动作找不到JSON和ASP.净MVC

这是因为您已经应用了[HttpPost]属性:)该属性使该操作仅用于post而不是get。你应该将与get相关的逻辑移到一个同名但不带[HttpPost]属性的操作中,并将处理post数据的逻辑保留在带有[HttpPost]属性的操作中。

建议在将逻辑划分为不同的方法时应重新考虑名称,否则名称会产生误导。

关于更新

我会有POST请求处理动作(你的动作标有HttpPost)返回一个ActionResult,这在本质上意味着成功处理请求后的POST请求处理动作将用户重定向到确认页面或其他地方。无论哪里都是最好的,真的:)

试着从逻辑上接近它,发布数据时自然的事件链是什么?作为用户,你希望发生什么?

关于您的GET操作,这是因为您没有发送参数o和t,然后您立即返回。因为这些参数在你的逻辑中没有发生任何变化,它们也没有被指定,所以它们将包含null,这是字符串类型变量的默认值。您是否不打算从数据库中检索数据,而只是提供两个参数以便立即返回它们?