条件服务器端验证 MVC 5

本文关键字:MVC 验证 服务器端 条件 | 更新日期: 2023-09-27 18:34:47

至少最初

,这是一个探索性的问题,看看什么是可能的,什么是不可能的,看看我想要实现的目标是否可能。

目前,我正在使用jQuery Unobsive验证与MVC标准服务器端验证结合使用,以便在通过Web表单提交数据之前执行验证。现在,我想让表单更加"动态",因此根据下拉菜单/单选按钮/复选框等的选择,表单的某些部分将显示或隐藏自己,但这对我来说是 2 个问题:

  1. jQuery Unobtrusive仍将尝试验证所有表单字段,即使它们被隐藏或将其显示设置为none。我想我可以使用一些jQuery来解决这个问题,每个元素上的自定义类标签,然后在UI更新时,循环访问元素并删除/添加data-val。这不是主要问题

    1. 这是大问题。由于我将使用数据注释装饰模型,因此当数据到达服务器时,如果数据的一部分为空,那么显然if(ModelState.IsValid())检查将失败,但我需要那里的注释来触发客户端验证

我想知道,有没有办法覆盖现有的 MVC 服务器端验证逻辑,这样如果选择了某个复选框或下拉值,那么某些逻辑将被简单地绕过。我之前编写了一个非常基本的自定义验证属性,当时我想根据连接方 IP 地址限制访问。

我知道我可以使用多个 ViewModels,但是当用户第一次访问该网站时,表单将不知道他们将进行哪种类型的提交,直到他们选择适当的选项,到那时,通用提交对象已经传递给 View on HTTP GET 控制器方法,理想情况下, 我想避免在提交后重新加载页面以简单地加载辅助 ViewModel。我还利用了文件上传器,文件信息等都存储在ViewModel中,因此这也需要传递,我可以看到这变得混乱。

public class Submission
{
    [HiddenInput(DisplayValue = false)]
    public Guid SubmissionID { get; set; }
    [Required(ErrorMessage = "Please provide your name")]
    public string Name { get; set; }
    [EmailAddress(ErrorMessage = "Invalid email address")]
    [Required(ErrorMessage = "Please enter an email address")]
    public string Email { get; set; }
    [Required(ErrorMessage = "Please provide a contact number")]
    [StringLength(13, ErrorMessage = "Phone number can be no more than 13 digits long")]
    public string Phone { get; set; }
    public string SubmissionPurpose { get; set; }
    //Suspicious Transaction
    //This should only be validated if, on the POST, the SubmissionPurpose matches the appropriate value
    [Required(ErrorMessage = "Please provide a date")]
    public string TransDateNoticed { get; set; }
    public string TransAdditionalDetails { get; set; }
    //Support Query
    //This should only be validated if, on the POST, the SubmissionPurpose matches the appropriate value
    [Required(ErrorMessage = "Please provide a date")]
    public string SupDateNoticed { get; set; }
    public string SupAdditionalDetails { get; set; }
    //Additional Data
    public string Message { get; set; }
    public List<UploadedFile> Attachments { get; set; }
    public IEnumerable<SelectListItem> SubmissionPurposes()
    {
        return new List<SelectListItem>
        {
            new SelectListItem() {Value = "", Text = "Please select an option"},
            new SelectListItem() {Value = "Suspicious Transaction Reporting", Text = "Suspicious Transaction Reporting"},
            new SelectListItem() {Value = "Request a Support Session", Text = "Request a Support Session"}
        };
    }

我对任何和所有建议都持开放态度,我认为某种自定义数据注释是最好的方法,因为这似乎是我可以对其进行精细控制的唯一方法,但是我的问题是如何有一个注释,就像我目前正在尝试在下面努力的想法一样

[CustomRequirement, SumissionPurpose = "Suspicious Transaction Reporting"]

我知道在 MVC 5.1 中他们引入了一个新的 DropdownForEnum 功能,但从我到目前为止的情况来看,我在 5.1 或 5.2 中看不到任何可能让我满足这种需求的新内容。

条件服务器端验证 MVC 5

我过去使用过万无一失的验证。它们提供了几个额外的属性客户端验证。

[Is]
[EqualTo]
[NotEqualTo]
[GreaterThan]
[LessThan]
[GreaterThanOrEqualTo]
[LessThanOrEqualTo]
[RequiredIf]
[RequiredIfNot]
[RequiredIfTrue]
[RequiredIfFalse]
[RequiredIfEmpty]
[RequiredIfNotEmpty]
[RequiredIfRegExMatch]
[RequiredIfNotRegExMatch]

自定义验证属性是要走的路。请注意,如果模型中的属性是复杂对象,并且它们的验证取决于父对象属性,则不会获得父对象属性的验证上下文。在这种情况下,您必须考虑编写自己的模型验证器,从ModelValidator类实现,并将其添加到ModelValidatorProvider工厂类中。