类mvc上的多个自定义验证属性

时间:2010-02-23 21:19:29

标签: asp.net-mvc validation

我正在创造一个更好理解的例子。

[CustomValidator("Property1","Property2", ErrorMessage= "Error1")]
[CustomValidator("Property3","Property4", ErrorMessage= "Error1")]
public class MyViewModel
{
    public string Property1 {get; set;}
    public string Property2 {get; set;}
    public string Property3 {get; set;}
    public string Property4 {get; set;}
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class CustomValidator : ValidationAttribute
{
    All the required stuff is written.
}

只有第二个验证器(或列表中的最后一个验证器)被触发并忽略第一个验证器。 我不确定这是否适合这种情况。 有什么建议吗?

4 个答案:

答案 0 :(得分:1)

如果您使用Linq to SQL,为什么不尝试这样的

添加规则违规类以处理规则违规

public class RuleViolation
{
    public string ErrorMessage { get; private set; }
    public string PropertyName { get; private set; }
    public RuleViolation(string errorMessage)
    {
        ErrorMessage = errorMessage;
    }
    public RuleViolation(string errorMessage, string propertyName)
    {
        ErrorMessage = errorMessage;
        PropertyName = propertyName;
    }
}

现在在您的数据类

[Bind(Exclude="ID")]
public partial class Something
{
    public bool IsValid
    {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations()
    {
        if (String.IsNullOrEmpty(Name.Trim()))
            yield return new RuleViolation("Name Required", "Name");
        if (String.IsNullOrEmpty(LocationID.ToString().Trim()))
            yield return new RuleViolation("Location Required", "LocationID");
        yield break;
    }

    partial void OnValidate(ChangeAction action)
    {
        if (!IsValid)
            throw new ApplicationException("Rule violations prevent saving");
    }

}

并在控制器的更新方法中,使用updatemodel方法更改属性

Something something = somethingRepo.GetSomething(id);
try
{
    //update something
    UpdateModel(something);
    somethingRepo.Save();
    return RedirectToAction("Index");
}
catch
{
    ModelState.AddRuleViolations(something.GetRuleViolations());
    return View(something);
}

这样您就可以在数据类发生变化时向其添加规则,并将其反映在您的更新等中

答案 1 :(得分:1)

我找到了另一个回答这个问题的问题。您必须覆盖Attribute.TypeId

Custom validation attribute with multiple instances problem

答案 2 :(得分:0)

通过为模型link text

创建metaData类,您真的不需要所有代码都使用数据注释

应该让你走上正确的道路还阅读html助手和好友类(这就是他们所谓的em)

答案 3 :(得分:0)

我遇到了同样的问题。

我想出了以下解决方案。

您的POCO类可能实现接口IValidatableObject。

这要求您实现以下方法。

    public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // return list of appropriate ValidationResult object            
        var customResult = new List<ValidationResult>();
        customResult.Add(new ValidationResult("message", new List<string>(){"Property1"});
    }

您可以在那里放置任何验证逻辑。这也比类级属性更有优势。类级属性只能在ValidationSummary中显示(它们与任何属性无关)。与之相反,您可以在返回ValidationResult时设置特定成员。这允许在消息所关注的特定控件旁边显示验证信息。