首页 > 解决方案 > 参数未从 Ajax 调用中填充(尝试了一切)

问题描述

大家好。

我有一个简单的Ajax电话。简单来说,它从密码字段中读取密码,将其填充到变量中,然后将其发送到我的强度检查控制器。所以一切正常,ajax 调用使其进入 StregthCheck ActionResult,并且 ajax 成功部分被 hunky-dory 解雇。但是,PasswordStrengthCheck actionResult 中的参数不会填充从我的 ajax 调用发送的密码。我真的相信我已经尝试了一切,无论是可能的解决方案还是高级调试技巧,任何输入都将不胜感激。

提前非常感谢,希望这个问题尽可能简单。

脚本

<script>

    $(document).ready(function () {
        $("#Password").change(function () {
            debugger
            var password = $("#Password").val();

            $.ajax({
                url: '@Url.Action("StrengthCheck", "Login")',
                data: { Password: password },
                dataType:'json',
                type: 'POST',
                success: function (result) {
                    $("#PasswordStrength").val(result);
                    if (result.PasswordStrength != "Blank" && result) {
                        console.log(result);
                        var lblStatus = document.getElementById("PasswordStrength");
                        lblStatus.style.width = result + "%";
                        switch (result)
                            {
                                case "20":
                                    $("#PasswordStrength").removeClass("progress-bar-success").addClass("progress-bar-warning");
                                    break;
                                case "40":
                                    $("#PasswordStrength").removeClass("progress-bar-success").addClass("progress-bar-warning");
                                    break;
                                case "60":
                                    $("#PasswordStrength").removeClass("progress-bar-warning").addClass("progress-bar-success");
                                    break;
                                case "80":
                                    $("#PasswordStrength").removeClass("progress-bar-warning").addClass("progress-bar-success");
                                    break;
                                case "100":
                                    $("#PasswordStrength").removeClass("progress-bar-warning").addClass("progress-bar-success");
                                    break;
                            }

                        }


                    },
                error: function (jqxhr, textStatus, errorThrown) {
                    console.log(jqxhr);
                    console.log(textStatus);
                    console.log(errorThrown);

                },
                    async: true,
                    processData: false

            });

        })



    });



</script>

登录控制器

        [AllowAnonymous]
        [HttpPost]
        public JsonResult StrengthCheck(PhysiotherapyDAL.ViewModels.PasswordResetViewModel data)
        {
            #region password strength
            PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(data.Password); 

            switch (passwordStrengthScore)
            {
                case PasswordScore.Blank:
                    data.PasswordStrength = 0;
                    return Json(JsonConvert.SerializeObject(data.PasswordStrength), JsonRequestBehavior.AllowGet);
                case PasswordScore.VeryWeak:
                    data.PasswordStrength = 20;
                    return Json(JsonConvert.SerializeObject(data.PasswordStrength), JsonRequestBehavior.AllowGet);
                case PasswordScore.Weak:
                    data.PasswordStrength = 40;
                    return Json(JsonConvert.SerializeObject(data.PasswordStrength), JsonRequestBehavior.AllowGet);
                case PasswordScore.Medium:
                    data.PasswordStrength = 60;
                    return Json(JsonConvert.SerializeObject(data.PasswordStrength), JsonRequestBehavior.AllowGet);
                case PasswordScore.Strong:
                    data.PasswordStrength = 80;
                    return Json(JsonConvert.SerializeObject(data.PasswordStrength), JsonRequestBehavior.AllowGet);
                case PasswordScore.VeryStrong:
                    data.PasswordStrength = 100;
                    return Json(JsonConvert.SerializeObject(data.PasswordStrength), JsonRequestBehavior.AllowGet);
                default:
                    break;
            }
            #endregion
            data.PasswordStrength = 0;
            return Json(JsonConvert.SerializeObject(data.PasswordStrength), JsonRequestBehavior.AllowGet);
        }

密码重置视图模型

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PhysiotherapyDAL.ViewModels
{
   public class PasswordResetViewModel
    {

        [Required(ErrorMessage = "Password required")]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [Display(Name = "Confirm Password")]
        [Required(ErrorMessage = "Confirm password required")]
        [DataType(DataType.Password)]
        [Compare("Password", ErrorMessage = "The two passwords do not match. Please ensure they match.")]
        public string ConfirmPassword { get; set; }

        public string ResetCode { get; set; }

        public string UserID { get; set; }
        
        public bool success { get; set; }

        public int PasswordStrength { get; set; }

    }
}

这是 chrome 调试的屏幕截图,显示了整个 ajax 调用中的数据填充 chrome 调试的 屏幕截图

标签: c#jqueryajaxasp.net-mvc-5

解决方案


HttpPost 可以从 QueryString 和请求正文中接收参数。默认情况下,在查询字符串中搜索原始类型,其中复杂类型被视为在正文中。

您的方法被定义为从查询字符串而不是正文接收密码。这就是它保持空白的原因。你有两种方法可以解决这个问题。

  • 您更改您的 ajax 调用,以便密码在查询字符串中。
  • 你改变你的方法来接收一个复杂的模型并留下你的 ajax
public class Model {
  public string Password {get; set;}
}

推荐阅读