实现写入类中的属性的类级验证属性

时间:2010-07-05 23:48:12

标签: c# asp.net-mvc validation asp.net-mvc-2 data-annotations

我正在构建一个ASP.NET MVC站点,我想用验证属性来装饰我的ViewModel。我要验证的一件事是,用户通过表单提交的地址是可地理编码的。为此,我已经创建了一个自定义ValidationAttribute并已应用于我的StreetAddress媒体资源。

这一切都很好,除了我实际上发出两个地理编码请求 - 一个在我的ViewModel中进行验证,另一个在我的Controller中输入纬度和经度到我的数据库中。我想减少不必要的网络使用和延迟,所以我需要通过 验证地理编码进入我的控制器。

要完成这样的事情,我想我应该在我的ViewModel中创建一个纬度和经度属性。视图本身不会触及这两个属性,但验证属性将报告地理编码失败并返回视图或将结果写入属性。

要获取访问3个属性的验证属性,必须将其应用于整个类。 我不知道该怎么做,但这就是这个问题的所在。

更新:感谢this answer,我已经找到了如何创建类级验证属性的方法。 link in the answer还演示了如何读取类内属性的内容(通过Reflection)。不过,我仍然没有弄清楚如何写一个属性。


我的问题

如何创建可应用于整个班级的ValidationAttribute?下面,我已将我想要转换的代码发布到可应用于我的ViewModel的属性中:

public class GeocodableAttribute : ValidationAttribute
    {
        public GeocodableAttribute() : base()
        {
            ErrorMessage = "We weren't able to find that location.";
        }
        public override bool IsValid(object value)
        {
            if (value == null) //we don't care if it's required or not.
            {
                return true;
            }
            var address = (string)value;
            var response = Geocoder.CallGeoWS(address.Trim());
            if(response.Status=="ZERO_RESULTS")
            {
                return false;
            }
            return true;
        }
    }

<击>


如何将属性写入类中的某些属性?当我将此属性应用于我的ViewModel时,我希望它将成功的地理编码结果写入两个属性return true。我该如何实现呢?

更新#2:我想我刚想出如何写一个属性。以下代码应该有效吗?

    private static void WritePropertyValue(object obj, string propertyName, object valueToWrite)
    {
        if (obj == null) return null;
        var type = obj.GetType();
        var propertyInfo = type.GetProperty(propertyName);
        if (propertyInfo == null) return null;
        propertyInfo.SetValue(obj, valueToWrite, null);
    }

这是否会破坏其他属性/属性的客户端验证?我的ViewModel中有其他属性,我使用内置的ValidationAttributes进行了修饰,例如[Required]和{{ 1}}。我还为它们启用了客户端验证。将我的新属性应用于整个ViewModel类会完全破坏客户端验证,还是会在客户端上执行其他属性的验证,然后在服务器上执行总验证?

1 个答案:

答案 0 :(得分:1)

1)您无法通过属性级别ValidationAttribute访问外部类。

您可以使用自定义模型绑定器来完成此操作。只需检测属性并进行相应验证。

创建自定义模型绑定器: http://www.singingeels.com/Articles/Model_Binders_in_ASPNET_MVC.aspx

2)不,你试过吗?

这几乎是重复的。我会查看我的欺骗提交的问题和答案。它可能包含一个单独的技术,类级别验证,可以做你需要的。