【问题标题】:ModelState.IsValid == falseModelState.IsValid == false
【发布时间】:2014-03-19 20:10:13
【问题描述】:

我正在处理登录页面,无论我做什么,我都无法让我的 ModelState.IsValid 返回 true,以便我可以让用户登录。 我的控制器中有这段代码:

[AllowAnonymous]
[HttpPost]
public ActionResult ValidateLogon(LogonModel logon)
{
    if (ModelState.IsValid)
    {
        StaffModel staff;
        if (staffAuthenticationService.ValidateLogon(logon.UserName, logon.Password, out staff, out logon))
        {
            staffAuthenticationService.SignIn(staff);
            return Json(new { success = true, redirect = "/Home/ModuleIndex", staff = staff });
        }
        ModelState.AddModelError("", "Username and/or Password may be incorrect");
    }

    return Json(new { errors = GetErrorsFromModelState() });   
}

我的登录模型有一个员工模型和一个用户模型,我的服务方法 validateLogon 传递了一个登录模型。我尝试使用:

var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

并记录错误,但我没有看到任何错误,valid 始终为 false。

有没有比使用这个字典对象更好的方法来验证用户,或者我还没有找到的解决方法。我已经找了几个小时了。

更新:

public class LogonModel
{
    [Display(Name = "User")]
    [DataType("UserModel")]
    public UserModel User { get; set; }

    [Display(Name = "Staff")]
    [DataType("StaffModel")]
    public StaffModel Staff { get; set; }

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

    [Required(ErrorMessage = "Please enter your username")]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Display(Name = "Terms Of Use Signed")]
    public bool IsTermsOfUseSigned { get; set; }

    [Display(Name = "Privacy Agreement Signed")]
    public bool IsPrivacyAgreementSigned { get; set; }

    [Display(Name= "System Message")]
    public string SystemLoginMessage { get; set; }

    [Display(Name="Version")]
    public string DatabaseVersion { get; set; }

    [Display(Name="Copyright Date")]
    public string CopyrightDate { get; set; }

    [Display(Name="Web Server")]
    public string WebServer { get; set; }

    [Display(Name = "Last Name")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Required")]
    [StringLength(50, ErrorMessage = "Value cannot exceed 50 characters")]
    public string LastName { get; set; }

    [Display(Name = "Date of Birth")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Required")]
    [StringLength(50, ErrorMessage = "Value cannot exceed 50 characters")]
    public string DateOfBirth { get; set; }

    [Display(Name = "Last 4 digits of XXXX SSN")]
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Required")]
    [StringLength(50, ErrorMessage = "Value must be 4 numbers")]
    public string SsnSuffix { get; set; }

    public int LogonValidationStep { get; set; }
}

当我将鼠标悬停在 if 语句上时,这是我在调试器中看到的:IsValid = false 然后当我进入该函数时,它会直接出现错误消息。

【问题讨论】:

  • 您可以发布您的 LogonModel 课程吗?您能否设置一个断点并查看返回 false 的模型状态中的错误。您可能会看到某个可能需要的字段没有被填充。
  • 在您的操作中放置一个断点并检查this.ModelState 属性,特别是键和值。这些值可能不一定包含异常。
  • 补充一点,这里有一个有用的 sn-p 来获取所有错误: var errorList = ModelState.Values.SelectMany(v => v.Errors);
  • @Guyute 如果您使用MVC 3 或更高版本,只需使用SimpleMembrshipProvider,它实际上与MVC 的预制模板之一集成。至于ModelState,我们需要查看您传递给View 的模型,并且您需要在视图返回结果时检查logon 的值,并尝试找出究竟是什么破坏了模型。
  • 我在控制器的第 131 行设置了一个中断,当我将鼠标悬停在它上面并向下旋转箭头时,我看到我的 ModelState.IsValid 为假。

标签: c# asp.net-mvc modelstate


【解决方案1】:

如果您的支票:

if (ModelState.IsValid)

返回 false,这很可能意味着视图中使用的模型中的必填字段之一填充了不正确的结果。在您发布模型后,DateOfBirth 字段似乎最可疑,因此删除 Required 属性使我们能够找出导致问题的原因并临时解决问题。

从现在开始,您有两个选择 - 保持原样(我不建议这样做)或进一步调查您未获得该字段的预期数据的原因。换句话说,不要回避问题,而是尝试解决问题并从中学习。

如果我的帖子对您​​有所帮助,您不妨接受它作为答案。

【讨论】:

  • 感谢您的帮助,我的长期解决方案是创建另一个用于密码恢复过程的模型。我们有员工用户和非员工用户,他们都使用相同的工作流程恢复密码,所以当我到达那里时,拥有一个通用模型会派上用场。我试图将所有登录案例塞进一个模型、视图和控件中。在满足或不满足条件时隐藏和显示视图。有时我猜你不可能一举搞定一切。我仍然是一名新程序员,所以有时我倾向于过度思考。
  • @Guyute 正如我在您的原始帖子中的评论中所写,使用集成的MVC 会员工具(如SimpleMembershipProviderIdentity 或其他您可能会发现更多的东西)真的很值得合适的。它们非常可扩展,并提供了许多您必须开箱即用的事情。至少,学习曲线并不大,所以值得,因为这是每个开发人员/应用程序最常见的任务之一。
猜你喜欢
  • 2019-05-20
  • 2013-09-08
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
相关资源
最近更新 更多