未找到控制器操作JSON和ASP.NET MVC

ASP*_*450 0 c# asp.net asp.net-mvc json

嗨,我有这种控制器方法

  [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);

    }
Run Code Online (Sandbox Code Playgroud)

这是我的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);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

当执行ShowBMI()时,Chrome说GET http://localhost:50279/BMICalculations/CalculateAndSaveToDB/0 404 (Not Found) POST会在保存到数据库等时起作用,但GET不会?这有什么理由吗?正如您所看到的,每个JS函数中的URL都完全相同,所以我不确定为什么它第二次发现一次坚果?

更新:

分离逻辑后,网页上显示的值均为空.请参阅下面的代码更改

   [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);
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*tim 5

那是因为你已经应用了[HttpPost]属性:)该属性使该动作仅用于POSTing而不是GETing.您应该将与GETing相关的逻辑移动到具有相同名称但没有[HttpPost]属性的操作,并保留用于在标记有[HttpPost]属性的操作中处理POSTed数据的逻辑.

请注意,在将逻辑分成不同的方法时,您应该重新考虑名称,否则名称会产生误导.

关于你的更新

我将POST请求处理操作(您的操作标记为HttpPost)返回一个ActionResult,这实际上意味着成功处理您的请求后的POST请求处理操作会将用户重定向到确认页面或其他地方.哪里最好真的:)

试着在逻辑上接近它,在发布数据时会有什么自然的事件链?您作为用户期望发生什么?

关于你的GET动作,那是因为你没有发送参数o和t,然后你会立即返回.由于逻辑中的这些参数没有任何反应,并且未另行指定,因此它们将包含null,这是string类型变量的默认值.您是不打算从数据库中检索数据,而不是只提供两个参数才能立即返回它们?