Я работаю над страницей входа в систему, и что бы я ни делал, я не могу заставить свой 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));
и регистрирую ошибки, но я не вижу ошибок, и действительность всегда ложна.
Есть ли лучший способ проверить пользователя, чем с помощью этого объекта словаря, или обходной путь, который я не нашел. Я искал пару часов.
Обновление:
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, затем, когда я вхожу в функцию, она попадает прямо в сообщение об ошибке.
this.ModelState
, особенно ключи и значения. Значения могут не обязательно содержать исключение. - person mxmissile   schedule 20.03.2014MVC 3
или выше, просто используйтеSimpleMembrshipProvider
, который на самом деле интегрирован с одним из готовых шаблонов для MVC. Что касаетсяModelState
, нам нужно увидеть модель, которую вы передаете своемуView
, а также вам нужно проверить значениеlogon
, когда результат возвращается из представления, и попытаться найти, что именно нарушает модель. - person Leron_says_get_back_Monica   schedule 20.03.2014false
формуModelState.IsValid
, одно или несколько ваших полейRequired
должны быть заполнены неверными данными. Поэтому убедитесь, что:LastName
заполнен строкой не длиннее 50 букв,DateOfBirth
заполнен и на самом деле является строкой, а не объектомDateTime
,SsnSuffix
заполнен строкой не длиннее 50 букв. Обязательно сделайте это и попробуйте еще раз. На самом деле просто временно удалитеRequired
изDateOfBirth
и отправьте форму, оставив ее пустой, и посмотрите, пройдете ли вы проверку. - person Leron_says_get_back_Monica   schedule 20.03.2014