Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IValidatableObject验证从POCO扩展的ViewModel 想象一下用户类。此类提供数据库中使用的唯一属性。 和带有验证器的用户类的视图模型 问题_C#_Asp.net Mvc_Validation_Ivalidatableobject - Fatal编程技术网

C# 使用IValidatableObject验证从POCO扩展的ViewModel 想象一下用户类。此类提供数据库中使用的唯一属性。 和带有验证器的用户类的视图模型 问题

C# 使用IValidatableObject验证从POCO扩展的ViewModel 想象一下用户类。此类提供数据库中使用的唯一属性。 和带有验证器的用户类的视图模型 问题,c#,asp.net-mvc,validation,ivalidatableobject,C#,Asp.net Mvc,Validation,Ivalidatableobject,通过属性指定的所有验证均已成功执行,所有错误均已成功显示在视图中。但是,验证是成功的​​通过IValidatableObject无法工作,并且不会显示任何错误。我找到了答案 在控制器完成所有其他验证之前,不会调用方法验证 别按我说的去做。最好看一看。更具体地说,首先,我建议不要将基本属性设置为新属性,因为这实际上是重复属性。将基类属性设置为虚拟,并在ViewModel中重写它们。另外,您的控制器似乎有一个输入错误。它不应该接受UserViewModel而不是UserModel的参数吗?调试时,如

通过属性指定的所有验证均已成功执行,所有错误均已成功显示在视图中。但是,验证是成功的​​通过IValidatableObject无法工作,并且不会显示任何错误。

我找到了答案 在控制器完成所有其他验证之前,不会调用方法验证


别按我说的去做。最好看一看。

更具体地说,首先,我建议不要将基本属性设置为新属性,因为这实际上是重复属性。将基类属性设置为虚拟,并在ViewModel中重写它们。另外,您的控制器似乎有一个输入错误。它不应该接受UserViewModel而不是UserModel的参数吗?调试时,如果在Validate方法上设置了断点,是否达到了断点?@xDaevax我将该类用于实体框架,据我所知,添加虚拟修改器会使该属性对于EF@xDaevax运行期间未使用验证方法。断点未被干扰。
public class User
{
    public string Login { get; set; }
    public string Password { get; set; }
    public DateTime ActiveDateStart { get; set; }
    public DateTime ActiveDateEnd { get; set; }
}
public class UserViewModel: User, IValidatableObject
{
    [Required(ErrorMessage = "Enter login")]
    [RegularExpression("[a-zA-Z][a-zA-Z0-9]*", ErrorMessage = "Only alpha and digits")]
    new public string Login { get; set; }

    [Required(ErrorMessage = "Enter password")]
    new public string Password { get; set; }

    public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (ActiveDateStart > ActiveDateEnd)
        {
            yield return new ValidationResult("Active period start must be before perion end date", new[] { "ActiveDateStart" });
        }
    }
}
<div class="form-group">
    @Html.LabelFor(m => m.Login })
    @Html.TextBoxFor(m => m.Login })
    @Html.ValidationMessageFor(m => m.Login)
</div>

<div class="form-group">
    @Html.LabelFor(m => m.Password })
    @Html.PasswordFor(m => m.Password })
    @Html.ValidationMessageFor(m => m.Password)
</div>

<div class="form-group">
    @Html.LabelFor(m => m.ActiveDateStart })
    @Html.TextBoxFor(m => m.ActiveDateStart })
    @Html.ValidationMessageFor(m => m.ActiveDateStart)
</div>

<div class="form-group">
    @Html.LabelFor(m => m.ActiveDateEnd })
    @Html.TextBoxFor(m => m.ActiveDateEnd })
    @Html.ValidationMessageFor(m => m.ActiveDateEnd)
</div>

@Html.ValidationSummary()
[HttpPost]
public ActionResult Create(UserViewModel model)
{
    if (ModelState.IsValid)
    {
        // do something
    }

    return View(model);
}