ModelState.IsValid продолжает возвращаться как ложный? - PullRequest
0 голосов
/ 28 апреля 2020

Так что у меня есть представление, где участник вводит связанный с ним PIN-код для синхронизации в

@model Models.Member
@{
    Layout = "~/Views/Shared/_HomeLayout.cshtml";
}

<h1 style="margin-top: 0px;">Club Members Login Below!</h1> @*add this to the style for better ipad title -> "text-align: center;"*@
</br>
@using (Html.BeginForm("ClubHours", "Login", FormMethod.Post))
{
    @Html.LabelFor(c => c.PIN)
    @Html.TextBoxFor(c => c.PIN)<br />
    @Html.ValidationMessageFor(c => c.PIN)<br />

    <input type="submit" name="submit" value="ClockIn" />
    <input type="submit" name="submit" value="ClockOut" />
}

, который взаимодействует с этим результатом действия:

[HttpPost]
public ActionResult ClubHours(string submit, Member member)//member clocking in
{
    if (submit.Equals("ClockIn"))
    {
        if (!ModelState.IsValid) //validating events fields
        {
            return View("UserLogin");
        }
        else
        {
            var mem = _context.Members.SingleOrDefault(c => c.PIN == member.PIN);
            var hours = new MemberClubHours();
            hours.ClockIn = DateTime.Now;
            mem.Hours.Add(hours);
            _context.SaveChanges();
            return View("ClockIn");
        }
    }
    else if (submit.Equals("ClockOut"))
    {
        if (!ModelState.IsValid) //validating events fields
        {
            return View("UserLogin");
        }
        else
        {
            var mem = _context.Members.SingleOrDefault(c => c.PIN == member.PIN);
            var hours = new MemberClubHours();
            hours.ClockOut = DateTime.Now;
            mem.Hours.Add(hours);
            _context.SaveChanges();
            return View("ClockOut");
        }
    }
    else
    {
        return View("UserLogin","Login");
    }
}

и, наконец, вот что Класс участника

public class Member
{
    public int Id { get; set; }
    [Required]
    [MaxLength(4, ErrorMessage = "PIN must be 4 numbers long"), MinLength(4, ErrorMessage = "PIN must be 4 numbers long")]
    public string PIN { get; set; }
    [Required]
    [Display(Name ="First Name")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
    [Display(Name = "Date of Birth")]
    public DateTime? Birthdate { get; set; }
    public virtual ICollection<MemberClubHours> Hours { get; } = new HashSet<MemberClubHours>();
}

и класс memberclubhours

public class MemberClubHours
{
    public int Id { get; set; }
    public DateTime? ClockIn { get; set; }
    public DateTime? ClockOut { get; set; }
    [Required]
    public Member Member { get; set; }
}

Код работает правильно и будет отслеживать часы участника, однако я пытаюсь выполнить проверку, но даже если я введите ПИН-код, связанный с членом в системе, он возвращается как недействительный? любая помощь будет оценена!

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Модель элемента выходит недействительной, поскольку модель элемента требует поля Id, PIN, FirstName, LastName .

Вы не можете проверить этот класс с помощью ModelState.IsValid, потому что он проверит все свойства-- и похоже, что вы только передаете свойство PIN.

Если вы не хотите создавать для него viewModel, вы можете просто включить эти свойства как скрытые поля ввода;

@using (Html.BeginForm("ClubHours", "Login", FormMethod.Post))
{
    @Html.HiddenFor(c=>c.Id)
    @Html.HiddenFor(c=>c.FirstName)
    @Html.HiddenFor(c=>c.LastName)

    @Html.LabelFor(c => c.PIN)
    @Html.TextBoxFor(c => c.PIN)<br />
    @Html.ValidationMessageFor(c => c.PIN)<br />

    <input type="submit" name="submit" value="ClockIn" />
    <input type="submit" name="submit" value="ClockOut" />
}
1 голос
/ 28 апреля 2020

Вы проверяете модель, отправленную с внешнего интерфейса. Не в базу данных, вы уверены, что модель заполнена в соответствии с вашими аннотациями данных в модели?

Проверьте ModelState это asp. net ядро ​​3.1, но все еще актуально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...