【问题标题】:Passing Model Data to JSON in ASP.NET MVC (returning null)在 ASP.NET MVC 中将模型数据传递给 JSON(返回 null)
【发布时间】:2014-06-01 15:07:54
【问题描述】:

我有这个代码:

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

当我单击提交按钮时,即使我的网页文本框中有值,也会出现一个警告说 null。在我的控制器中有没有办法解决这个问题?

更新 1 - 所以我更改了 Create() 代码,但现在我不明白 ' 然后更改您的代码,以便您使用序列化表单执行 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);
    }

【问题讨论】:

    标签: javascript jquery asp.net json


    【解决方案1】:

    如果我没听错的话,当你点击提交按钮时,你实际上是在执行两个请求,彼此不知道:

    • 一个常规形式的帖子,经过处理并与视图一起返回。
    • Ajax GET 请求,从控制器上的 ShowBMI 获取一些数据。此操作需要 string,由于您没有向其传递任何数据,因此它返回 null。

    再一次,如果我理解正确,您想要实现的场景是,当您发布表单时,您希望返回一个 Json 有效负载以及处理后的结果。 如果这是正确的,那么您可能想要做的是让您的 Create 操作返回 Json ,然后更改您的代码以便您使用您的序列化表单执行 Ajax POST。然后在您的 Ajax success 处理程序过程中你得到的结果,就像你现在做的一样。我希望我的意图很清楚,否则,请要求澄清。 :)

    【讨论】:

    • 您好,您确实理解正确。我已将创建操作更改为返回 JsonResult。带有序列化表单的 Ajax POST 是什么意思?和 Ajax 成功处理程序?谢谢
    【解决方案2】:

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

    你应该试试这样的..

     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 () {
    
                            }
                        });
                       }
    

    【讨论】:

    • 此代码是否替换了我现有的任何代码,或者我应该结合使用它吗?
    • 另外,如果我已经使用 HttpPost 将参数发布到表单,为什么我需要使用 AJAX 再次传递它们?
    • 您没有在发布的代码中传递参数。您可以组合使用此代码。我认为您可以使用此脚本替换您的ShowBMI() 函数。当心语法错误,例如缺少括号;)
    • 好的,'CalculateBMI' 是什么意思:你的数据?
    • 我是不是把参数误认为是体重和身高以外的意思?它们通过使用 HttpPost 和 FormMethod.Post 的 Create 方法在提交点击时传递到控制器中。
    【解决方案3】:

    搭配使用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多