ASP.NET MVC 1.0 Validação com XVAL
-
21-09-2019 - |
Pergunta
Na verdade, estou bem com o uso de outro método de validação. Parece que não há muitas opções pré -criadas para fazer validação com o ASP.NET MVC 1.0. A principal coisa de que vejo pessoas falando é XVAL. No entanto, literalmente não há documentação para isso. De fato, o blog do fundador parece ter apenas duas postagens.
De qualquer forma, é a única coisa que já vi que também pode fornecer validação do cliente. Meu problema é que não posso usar coisas baseadas em atributos, porque estou gerando meus modelos usando o llblgen e não quero modificar o código.
Tudo o que li sobre o XVAL fala sobre a possibilidade de implementar um IrulesProvider, mas nenhuma informação real de como fazer isso e usá -lo. Encontrei algum código que o implementa, mas usando atributos que eu realmente não posso fazer.
Então, alguém pode fornecer algumas orientações sobre como usar o XVAL se eu não estiver codificando as aulas de minhas modelos ou vou usar o DataNotações ou algo semelhante (estou aberto a uma alternativa ao XVAL, mas não vi nada e preciso Fique com o ASP.NET MVC 1.0 e eu preciso de suporte à validação do lado do cliente)?
Editar: Não acho que uma abordagem de classe parcial funcione para mim, porque eu estarei gerando muito o código e eles estarão em diferentes montagens.
Solução
Você pode usar o XVAL com o LLBLGEN ou qualquer outra classes geradas pelo ORM usando o atributo Metadatatype em uma classe parcial. Por exemplo, se você tiver uma entidade gerada por LLBL chamada Userentity, você criaria uma classe parcial e a marcará com um atributo metadatatype como este:
[MetadataType(typeof(UserEntityMetaData))]
public partial class UserEntity
{
}
Você vai criar a meta -classe, onde pode marcar as propriedades com os atributos apropriados como este:
public class UserEntityMetaData
{
[Required()]
[StringLength(50)]
[DataType(DataType.EmailAddress)]
public object EmailAddress { get; set; }
[Required()]
[StringLength(32)]
[DataType(DataType.Password)]
public object Password { get; set; }
[Required()]
[StringLength(25)]
public object FirstName { get; set; }
[Required()]
[StringLength(25)]
public object LastName { get; set; }
}
Isso permitirá que você não precise alterar o código gerado por LLBL, apenas suas classes parciais personalizadas. O único problema é que você deseja a classe parcial e a meta -classe no mesmo espaço de nome das classes de entidade geradas. Você não precisa fazer isso, mas isso facilita as coisas quando você chama a validação XVAL.
Outras dicas
Além do que a JCERHEA disse que você também precisa modificar como a classe DataNoTationsValidationRunner está configurada para lidar com as classes "Buddy" no método getErrors, por exemplo,
namespace Entities
{
public static class DataAnnotationsValidationRunner
{
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);
}
}
}