你如何进行Web表单模型验证?

时间:2011-04-08 20:58:35

标签: c# asp.net validation entity-framework-4 model

我们有一个包含三个层的应用程序: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来解释如何为它构建服务器控件,但我似乎无法让它工作。它编译甚至识别控制,但我永远无法解决它。

有什么想法吗?

谢谢大家。

2 个答案:

答案 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描述控制构建的想法。