我正在创造一个更好理解的例子。
[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.
}
只有第二个验证器(或列表中的最后一个验证器)被触发并忽略第一个验证器。 我不确定这是否适合这种情况。 有什么建议吗?
答案 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。
答案 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时设置特定成员。这允许在消息所关注的特定控件旁边显示验证信息。