我们试图让条件属性起作用,例如,有一个布尔(复选框),如果选中,则需要其相关文本。所以,理想情况下我们会有... ...
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; }
我讨厌使用魔法字符串方法......但还有其他想法吗?
答案 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);
这可能是一种更清洁的方式,但到目前为止,这一直很好。