Закончилось кататься самостоятельно. По сути, вы создаете метод оценки, который выполняет обычную проверку «да», «нет», что угодно и собирает их в какой-то сбор ошибок. Проблема с этим отправляет его обратно в саму модель. Так что я поленился и сильно набрал его как таковой ...
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);
Возможно, есть более чистый способ сделать это, но до сих пор это работало просто отлично.