验证的条件必需属性

时间:2010-03-23 21:23:34

标签: asp.net validation

我们试图让条件属性起作用,例如,有一个布尔(复选框),如果选中,则需要其相关文本。所以,理想情况下我们会有... ...

public bool Provision { get; set; }

[ConditionalRequirement(IsNeededWhenTrue = Provision)]
public string ProvisionText { get; set; }

这甚至可能吗?

替代想法(不是很优雅?)

    public bool Provision2 { get; set; }

    [PropertyRequired(RequiredBooleanPropertyName = "Provision2")]
    public string Provision2Text { get; set; }

我讨厌使用魔法字符串方法......但还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

结束我自己。基本上你创建了一个valiation方法,可以正常检查yes,no,whatever并在某种错误集合中收集它们。与此相关的是将它发送回模型本身。所以我变得很懒,并且强烈地输入它......

public static void AddError<T>(this ErrorCollection errorCollection, Expression<Func<T, object>> expression, string friendlyUiName)
{
    var propertyName = GetPropertyName(expression.ToString(), expression.Parameters[0].Name);
    var propertyInfo = typeof (T).GetProperty(propertyName);
    var resultError = DetermineOutput(friendlyUiName, propertyInfo.PropertyType);
    errorCollection.Errors.Add(new ValidationError(propertyName, resultError));
}

那么你的验证陈述中就有这样的东西......

    if (FirstName.IsEmpty())
        EntityErrorCollection.AddError<SomeClass>(x => x.FirstName, "First Name");

然后在控制器内进行简单检查并将其移回模型(如果它当然无效)......

    foreach (var error in someObject.EntityErrorCollection.Errors)
         ModelState.AddModelError(error.Property, error.Message);

这可能是一种更清洁的方式,但到目前为止,这一直很好。