【问题标题】:Require validation only if the field is visible仅当字段可见时才需要验证
【发布时间】:2011-04-20 14:17:16
【问题描述】:

我在 ASP.NET MVC 3 中使用[Required] 属性进行客户端验证。

类看起来像:

public class User
{
    [Required(ErrorMessage = "First Name is required")]
    public string FirstName { get; set; }
}

我希望字段 FirstName 仅在可见时才被验证,该字段仅在特定条件下显示。我该怎么做?

我使用了以下内容,但它仍然希望验证该隐藏字段的必填字段。

$('#registerForm').validate({ ignore: ":not(:visible)" });

【问题讨论】:

  • 我假设,如果你仔细看,你会发现在 javascript 中添加忽略指令会停止客户端验证。但是在帖子中,服务器端验证会启动,并会返回一个包含验证消息的页面。

标签: jquery asp.net-mvc-3 jquery-validate requiredfieldvalidator client-side-validation


【解决方案1】:

借助@Josiah 的一些有用提示,我能够满足我的要求。

添加RequiredIfAttribute 类和所需的javascript。参考Conditional Validation in ASP.NET MVC 3

并在类中添加RequiredIf 属性为:

public class User
{
[RequiredIf("hFirstName", "true", ErrorMessage = "First Name is required")]
public string FirstName { get; set; }

在 aspx 中:

@Html.TextBoxFor(model => Model.FirstName, new { @style = "height:auto;" })
@Html.ValidationMessageFor(model => Model.FirstName)
@Html.Hidden("hFirstName")

如果 FirstName 字段隐藏,则将 hFirstName 的值设置为“true”,如果可见,则设置为“false”。

魔法对这些变化起作用。感谢@Josiah Ruddell 的answer

【讨论】:

  • 这东西太棒了! Simon Ince 现在在这里发布了 Mvc.ValidationTookit Alpha 版:blogs.msdn.com/b/simonince/archive/2011/09/29/…!它真的应该在 GitHub repo IMO 中。 :)
  • 我终于让“RequiredIf”工作了,但我不得不稍微更改一下代码。出于某种原因,它仅在扩展 RequiredAttribute 而不是 ValidationAttribute 时才有效,另外需要指出的是客户端的 .addMethod 需要位于 jQuery.ready() 函数之外。这是使用 C# 4.5,jQuery.validator 1.8.1
【解决方案2】:

我会创建一个有条件要求的属性。有一篇关于使用 jQuery 验证创建一个的好文章 here

另一种选择:您可以引用像 Foolproof validation (codeplex) 这样提供此功能和客户端脚本的项目。

此外,您可以利用 ajax 加载部分视图,这样它们在隐藏时就不会出现在页面上。这将完全避免条件验证。

【讨论】:

  • 有没有像RequiredIfVisible这样的自定义属性?在 FoolProof 中有诸如RequiredIf、RequiredIfNot、...等属性,我无法将它们用于我的要求。
  • 我不知道。但是您可以在隐藏字段上使用 requiredif。无论是隐藏/显示内容,都会简单地更新隐藏字段。
【解决方案3】:

试试我的自定义validation attribute

[ConditionalRequired("hFirstName==true")]
public string FirstName {get, set};

支持多种条件。

【讨论】:

  • 你能解释一下如何在我的项目中包含这个(Javascript和C#代码)吗?
【解决方案4】:

有点晚了,

namespace System.ComponentModel.DataAnnotations
{
    public class RequiredIfVisibleAttribute : RequiredAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext context)
        {
            if (HttpContext.Current.Request.Form.AllKeys.Contains(context.MemberName))
                return base.IsValid(value, context);

            return ValidationResult.Success;
        }
    }
}

但这是我的解决方案。

只是对Required的继承,其行为方式相同,只是它仅在字段包含在发布的键中时才会激活。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 2016-01-10
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多