Существует CSS Сетки Yahoo, который может сделать все виды вещей.
, Но помните: CSS НЕ ЯВЛЯЕТСЯ РЕЛИГИЕЙ . При сохранении часов при помощи таблиц вместо css сделайте так.
Один из угловых случаев я никогда не мог составлять свой ум о, формы. Я хотел бы сделать это в css, но это именно так намного более сложно, чем таблицы.
Вы могли даже утверждать, что формы являются таблицами, в этом у них есть заголовки (маркировки) и данные (поля ввода).
Вы можете использовать класс DataAnnotations.Validator, как описано здесь:
Но если вы используете класс «приятель» для метаданных, вам необходимо зарегистрировать этот факт перед проверкой, как описано здесь. :
http://forums.silverlight.net/forums/p/149264/377212.aspx
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(typeof(myEntity),
typeof(myEntityMetadataClass)),
typeof(myEntity));
List<ValidationResult> results = new List<ValidationResult>();
ValidationContext context = new ValidationContext(myEntity, null, null)
bool valid = Validator.TryValidateObject(myEntity, context, results, true);
{{1 }} [Добавлено следующее в ответ на комментарий Шимми]
Я написал общий метод для реализации вышеупомянутой логики, чтобы любой объект мог его вызвать:
// If the class to be validated does not have a separate metadata class, pass
// the same type for both typeparams.
public static bool IsValid<T, U>(this T obj, ref Dictionary<string, string> errors)
{
//If metadata class type has been passed in that's different from the class to be validated, register the association
if (typeof(T) != typeof(U))
{
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T));
}
var validationContext = new ValidationContext(obj, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(obj, validationContext, validationResults, true);
if (validationResults.Count > 0 && errors == null)
errors = new Dictionary<string, string>(validationResults.Count);
foreach (var validationResult in validationResults)
{
errors.Add(validationResult.MemberNames.First(), validationResult.ErrorMessage);
}
if (validationResults.Count > 0)
return false;
else
return true;
}
В каждом объекте, который должен быть проверено, я добавляю вызов этого метода:
[MetadataType(typeof(Employee.Metadata))]
public partial class Employee
{
private sealed class Metadata
{
[DisplayName("Email")]
[Email(ErrorMessage = "Please enter a valid email address.")]
public string EmailAddress { get; set; }
}
public bool IsValid(ref Dictionary<string, string> errors)
{
return this.IsValid<Employee, Metadata>(ref errors);
//If the Employee class didn't have a buddy class,
//I'd just pass Employee twice:
//return this.IsValid<Employee, Employee>(ref errors);
}
}
Я думаю, что в ответе Крейгса не хватает того, как на самом деле проверить наличие ошибок валидации. Это средство проверки подлинности DataAnnotation, написанное Стивом Сандерсоном для тех, кто хочет выполнить проверку проверки на отличном уровне, а затем в презентации ( http://blog.codeville.net/category/xval/ , код находится в примере проекта ):
public static IEnumerable<ErrorInfo> GetErrors(object instance)
{
var metadataAttrib = instance.GetType().GetCustomAttributes
(typeof(MetadataTypeAttribute), true).
OfType<MetadataTypeAttribute>().FirstOrDefault();
var buddyClassOrModelClass =
metadataAttrib != null ?
metadataAttrib.MetadataClassType :
instance.GetType();
var buddyClassProperties = TypeDescriptor.GetProperties
(buddyClassOrModelClass).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties
(instance.GetType()).Cast<PropertyDescriptor>();
return from buddyProp in buddyClassProperties
join modelProp in modelClassProperties
on buddyProp.Name equals modelProp.Name
from attribute in buddyProp.Attributes.
OfType<ValidationAttribute>()
where !attribute.IsValid(modelProp.GetValue(instance))
select new ErrorInfo(buddyProp.Name,
attribute.FormatErrorMessage(string.Empty), instance);
}
Я не знаком с WPF (не уверен, есть ли какое-нибудь готовое решение для вашего вопроса), но, возможно, вы сможете его использовать.
Также есть некоторые комментарии к его блог, что в некоторых случаях он не может правильно оценить правило проверки, но это никогда не подводило меня.
Используйте «приятельский класс». Номер 4 в этой инструкции .
У меня был тот же вопрос и обнаружил следующие идеи:
В .NET 4 есть поддержка проверки в Entity-Framework с использованием этого расширения, проверьте: http: / /blogs.msdn.com/adonet/archive/2010/01/13/introduction-the-portable-extensible-metadata.aspx
Я не уверен, что он использует DataAnnotations.
ОБНОВЛЕНИЕ
Я пробовал это с VB.NET, и это не сработало, я думаю, что он поддерживает только проекты C #.
Я написал валидатор на основе Contributor, который включает участника проверки DataAnnotation, а также проверяет наличие нарушенных привязок (где пользователь ввел неправильный тип)
http://adammills.wordpress.com/2010/07/21/mvvm-validation-and-type-checking/