首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC条件验证

ASP.NET MVC条件验证
EN

Stack Overflow用户
提问于 2010-03-10 21:19:45
回答 10查看 156.9K关注 0票数 131

如何使用数据注释对模型进行条件验证?

例如,假设我们有以下模型(Person和and ):

代码语言:javascript
复制
public class Person
{
    [Required(ErrorMessage = "*")]
    public string Name
    {
        get;
        set;
    }

    public bool IsSenior
    {
        get;
        set;
    }

    public Senior Senior
    {
        get;
        set;
    }
}

public class Senior
{
    [Required(ErrorMessage = "*")]//this should be conditional validation, based on the "IsSenior" value
    public string Description
    {
        get;
        set;
    }
}

和以下视图:

代码语言:javascript
复制
<%= Html.EditorFor(m => m.Name)%>
<%= Html.ValidationMessageFor(m => m.Name)%>

<%= Html.CheckBoxFor(m => m.IsSenior)%>
<%= Html.ValidationMessageFor(m => m.IsSenior)%>

<%= Html.CheckBoxFor(m => m.Senior.Description)%>
<%= Html.ValidationMessageFor(m => m.Senior.Description)%>

我想成为基于对"IsSenior“属性的选择的"Senior.Description”属性条件必填字段(需要真正的-> )。如何在ASP.NET MVC2中实现带数据注解的条件验证?

EN

回答 10

Stack Overflow用户

发布于 2011-03-13 04:40:04

在MVC3中添加条件验证规则有一个更好的方法;让您的模型继承IValidatableObject并实现Validate方法:

代码语言:javascript
复制
public class Person : IValidatableObject
{
    public string Name { get; set; }
    public bool IsSenior { get; set; }
    public Senior Senior { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
        if (IsSenior && string.IsNullOrEmpty(Senior.Description)) 
            yield return new ValidationResult("Description must be supplied.");
    }
}

请访问Introducing ASP.NET MVC 3 (Preview 1)了解更多信息。

票数 153
EN

Stack Overflow用户

发布于 2013-04-13 00:00:06

昨天我也遇到了同样的问题,但我用了一种非常简洁的方式,这对客户端和服务器端的验证都有效。

条件:基于模型中其他属性的值,您希望使另一个属性成为必需属性。以下是代码

代码语言:javascript
复制
public class RequiredIfAttribute : RequiredAttribute
{
    private String PropertyName { get; set; }
    private Object DesiredValue { get; set; }

    public RequiredIfAttribute(String propertyName, Object desiredvalue)
    {
        PropertyName = propertyName;
        DesiredValue = desiredvalue;
    }

    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        Object instance = context.ObjectInstance;
        Type type = instance.GetType();
        Object proprtyvalue = type.GetProperty(PropertyName).GetValue(instance, null);
        if (proprtyvalue.ToString() == DesiredValue.ToString())
        {
            ValidationResult result = base.IsValid(value, context);
            return result;
        }
        return ValidationResult.Success;
    }
}

其中,PropertyName是要在其上设置条件的属性DesiredValue是PropertyName (属性)的特定值,必须验证其他属性是否为required

假设您有以下内容

代码语言:javascript
复制
public class User
{
    public UserType UserType { get; set; }

    [RequiredIf("UserType", UserType.Admin, ErrorMessageResourceName = "PasswordRequired", ErrorMessageResourceType = typeof(ResourceString))]
    public string Password
    {
        get;
        set;
    }
}

最后但并非最不重要的一点是,为您的属性注册适配器,以便它可以执行客户端验证(我将其放在global.asax,Application_Start中)

代码语言:javascript
复制
 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute),typeof(RequiredAttributeAdapter));
票数 39
EN

Stack Overflow用户

发布于 2016-06-17 23:52:46

我一直在使用这个神奇的nuget,它可以做动态注解ExpressiveAnnotations

你可以验证你所梦想的任何逻辑:

代码语言:javascript
复制
public string Email { get; set; }
public string Phone { get; set; }
[RequiredIf("Email != null")]
[RequiredIf("Phone != null")]
[AssertThat("AgreeToContact == true")]
public bool? AgreeToContact { get; set; }
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2417113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档