c# - 参数未从 Ajax 调用中填充(尝试了一切)
问题描述
大家好。
我有一个简单的Ajax
电话。简单来说,它从密码字段中读取密码,将其填充到变量中,然后将其发送到我的强度检查控制器。所以一切正常,ajax 调用使其进入 StregthCheck ActionResult,并且 ajax 成功部分被 hunky-dory 解雇。但是,Password
StrengthCheck 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 调试的 屏幕截图
解决方案
HttpPost 可以从 QueryString 和请求正文中接收参数。默认情况下,在查询字符串中搜索原始类型,其中复杂类型被视为在正文中。
您的方法被定义为从查询字符串而不是正文接收密码。这就是它保持空白的原因。你有两种方法可以解决这个问题。
- 您更改您的 ajax 调用,以便密码在查询字符串中。
- 你改变你的方法来接收一个复杂的模型并留下你的 ajax
public class Model {
public string Password {get; set;}
}
推荐阅读
- excel - Excel VBA - 将一个元素的第 3 到第 6 维写入范围
- python - Tkinter 中的“停止”按钮
- c++ - 使用自定义对象对向量进行排序
- javascript - 仅选择与选择器匹配的父节点
- c - C、我的 switch 语句在控制台上没有输出
- jquery - Jquery-从文本中选择单个单词
- java - Android studio (java) - 访问存储权限被拒绝?
- unity3d - 是否可以仅使用 GPU 信息来计算可以在统一 3d 中渲染多少个多边形?
- computer-vision - Intel movidius Stick setup ldconfig igfxcmrt64.so 不是符号链接
- azure - 如何使用工作流在 Azure 存储中创建 msg(outlook) blob?