【发布时间】: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