【问题标题】:ModelState.IsValid keeps coming back as false?ModelState.IsValid 不断返回为假?
【发布时间】:2020-04-27 21:35:38
【问题描述】:

所以我有一个视图,其中成员输入与他们关联的 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; }
}

代码可以正常工作,并且会跟踪成员的工作时间,但是我正在尝试实施验证,但即使我输入了与系统中的成员相关联的 PIN,它仍然无效?任何帮助将不胜感激!

【问题讨论】:

  • 也打印ValidationSummary
  • 查看this answer 查找模型错误。

标签: c# asp.net-mvc entity-framework validation


【解决方案1】:

您正在验证从前端发送的模型。不是数据库,您确定模型是根据模型中的数据注释填充的吗?

查看 ModelState 它是 asp.net core 3.1,但仍然相关

【讨论】:

    【解决方案2】:

    成员模型显示为无效,因为成员模型需要 Id、PIN、FirstName、LastName 字段。

    您无法使用ModelState.IsValid 验证此类,因为它会检查所有属性--看起来您只是在传递 PIN 属性。

    如果您不想为其创建视图模型,则可以将这些属性包含为隐藏的输入字段;

    @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" />
    }
    

    【讨论】:

    • 啊啊啊对了!我应该知道的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2020-08-23
    • 2018-02-16
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多