在ASP.NET MVC中将模型数据传递给JSON(返回null)

时间:2014-06-01 15:07:54

标签: javascript jquery asp.net json

我有这段代码:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(BMICalculation CalculateBMI)
    {
        if (ModelState.IsValid)
        {
            CalculateBMI.Id = User.Identity.GetUserId();
            CalculateBMI.Date = System.DateTime.Now;
            CalculateBMI.BMICalc = CalculateBMI.CalculateMyBMI(CalculateBMI.Weight, CalculateBMI.Height);
            CalculateBMI.BMIMeaning = CalculateBMI.BMIInfo(CalculateBMI.BMICalc);
            ShowBMI(CalculateBMI.ToString());
            db.BMICalculations.Add(CalculateBMI);
            db.SaveChanges();
        }
        return View();
    }

    public JsonResult ShowBMI(string BMICalculation){
        BMICalculation BMI = new BMICalculation();
        var data = new
        {
            BMICalculation
        };
        return Json(data, JsonRequestBehavior.AllowGet);
    }

我希望BMI计算从Create(BMICalculation CalculateBMI)方法传递到ShowBMI方法,以便它可以作为Json值传递到我的网页。

javascript函数由提交按钮(也处理表单)调用:

  <button type="submit" id="submit" onclick="ShowBMI();"> <span class="glyphicon glyphicon-floppy-save"></span></button>

我的JS是

<script type="text/javascript">
    $(function ShowBMI() {
        $.getJSON('/BMICalculations/ShowBMI', function (data) {
            alert(data.BMICalculation);
        });
    });

</script>

当我点击提交按钮时,即使我的网页文本框中包含值,也会显示一条提示为空的提示。在我的控制器中有这种方法吗?

更新1 - 所以我改变了我的Create()代码但现在我不明白&#39;然后更改您的代码,以便使用序列化的表单&#39;

执行Ajax POST
    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonResult Create(BMICalculation CalculateBMI)
    {
        if (ModelState.IsValid)
        {
            CalculateBMI.Id = User.Identity.GetUserId();
            CalculateBMI.Date = System.DateTime.Now;
            CalculateBMI.BMICalc = CalculateBMI.CalculateMyBMI(CalculateBMI.Weight, CalculateBMI.Height);
            CalculateBMI.BMIMeaning = CalculateBMI.BMIInfo(CalculateBMI.BMICalc);
            db.BMICalculations.Add(CalculateBMI);
            db.SaveChanges();
        }

        var data = new
        {
            BMICalculation = CalculateBMI.BMICalc,
            BMIInfo = CalculateBMI.BMIMeaning
        };

        return Json(data, JsonRequestBehavior.AllowGet);
    }

3 个答案:

答案 0 :(得分:0)

如果我理解你正确,当你点击提交按钮时,你实际上是在执行两个请求,而不是彼此不知道:

  • 一个常规表单帖子,已处理完毕,并随视图一起返回。
  • Ajax GET请求,它从控制器上的ShowBMI获取一些数据。此操作需要string,并且由于您未向其传递任何数据,因此它将返回null。

同样,如果我理解正确,那么您希望实现的方案是,在POST表单时,需要使用处理结果返回Json有效负载。 如果这是正确的,那么您可能想要做的事情是让您的Create操作返回Json,然后更改您的代码,以便使用序列化的形式执行Ajax POST。然后在您的Ajax中{{1处理程序处理你得到的结果,就像你现在正在做的那样。我希望我的意图很明确,否则请求澄清。 :)

答案 1 :(得分:0)

您必须将所需参数传递给控制器​​中的方法...

你应该尝试这样的事情......

 function ShowBMI() {


                    $.ajax({

                        url: "@Url.Action("Create", "Your Controller")",
                        data: {
                            'CalculateBMI': your Data
                        },
                        dataType: 'json',
                        type: 'POST',
                        success: function (response) {
                            try {

                              alert(response.BMICalculation);

                            }
                            catch (error) {

                            }
                        },
                        error: function () {

                        }
                    });
                   }

答案 2 :(得分:0)

使用

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(BMICalculation CalculateBMI)
    {
        if (ModelState.IsValid)
        {
           return Json(obj, JsonRequestBehavior.AllowGet);
        }
        else
        {
           return View();
        }
    }

您可以使用ActionResult获取该方法并使用Json Obejct返回