我们有一个包含三个层的应用程序:UI,业务和数据。数据层包含Entity Framework v4并自动生成我们的实体对象。我为实体VendorInfo
创建了一个好友类:
namespace Company.DataAccess
{
[MetadataType(typeof(VendorInfoMetadata))]
public partial class VendorInfo
{
}
public class VendorInfoMetadata
{
[Required]
public string Title;
[Required]
public string Link;
[Required]
public string LinkText;
[Required]
public string Description;
}
}
我希望此验证能够冒泡到UI,包括分配给它们的自定义验证消息。在MVC中,这是一块蛋糕,但在网络形式中,我不知道从哪里开始。在asp.net Web表单中使用模型验证的最佳方法是什么?
我确实找到an article来解释如何为它构建服务器控件,但我似乎无法让它工作。它编译甚至识别控制,但我永远无法解决它。
有什么想法吗?
谢谢大家。
答案 0 :(得分:4)
我解决了。看起来server control I found 似乎不是通过MetadataType属性读取好友类中的字段。我修改了代码以在buddy类中查找其验证属性,而不是实体类本身。
以下是链接服务器控件的修改版本:
[DefaultProperty("Text")]
[ToolboxData("<{0}:DataAnnotationValidator runat=server></{0}:DataAnnotationValidator>")]
public class DataAnnotationValidator : BaseValidator
{
#region Properties
/// <summary>
/// The type of the source to check
/// </summary>
public string SourceTypeName { get; set; }
/// <summary>
/// The property that is annotated
/// </summary>
public string PropertyName { get; set; }
#endregion
#region Methods
protected override bool EvaluateIsValid()
{
// get the type that we are going to validate
Type source = GetValidatedType();
// get the property to validate
FieldInfo property = GetValidatedProperty(source);
// get the control validation value
string value = GetControlValidationValue(ControlToValidate);
foreach (var attribute in property.GetCustomAttributes(
typeof(ValidationAttribute), true)
.OfType<ValidationAttribute>())
{
if (!attribute.IsValid(value))
{
ErrorMessage = attribute.ErrorMessage;
return false;
}
}
return true;
}
private Type GetValidatedType()
{
if (string.IsNullOrEmpty(SourceTypeName))
{
throw new InvalidOperationException(
"Null SourceTypeName can't be validated");
}
Type validatedType = Type.GetType(SourceTypeName);
if (validatedType == null)
{
throw new InvalidOperationException(
string.Format("{0}:{1}",
"Invalid SourceTypeName", SourceTypeName));
}
IEnumerable<MetadataTypeAttribute> mt = validatedType.GetCustomAttributes(typeof(MetadataTypeAttribute), false).OfType<MetadataTypeAttribute>();
if (mt.Count() > 0)
{
validatedType = mt.First().MetadataClassType;
}
return validatedType;
}
private FieldInfo GetValidatedProperty(Type source)
{
FieldInfo field = source.GetField(PropertyName);
if (field == null)
{
throw new InvalidOperationException(
string.Format("{0}:{1}",
"Validated Property Does Not Exists", PropertyName));
}
return field;
}
#endregion
}
此代码仅在好友类中查找。如果你想要检查一个实际的类,然后检查它的伙伴类,你将不得不相应地修改它。我不打扰这样做,因为通常如果您使用伙伴类来验证属性,那是因为您无法使用主实体类中的属性(例如实体框架)。
答案 1 :(得分:0)
对于Web表单中的模型验证,我正在使用DAValidation库。它支持客户端验证(包括不显眼的验证),基于与MVC相同的原则的可扩展性。它是MS-PL许可的,可通过Nuget获得。
这里有点过时article描述控制构建的想法。