MVC验证属性

时间:2011-01-16 14:36:02

标签: asp.net-mvc validation

在验证强类型视图模型时,如何使用验证属性验证类。

假设你有一个像这样的视图模型:

[PropertiesMustMatch("Admin.Password", "Admin.ConfirmPassword")]
public class AdminsEditViewModel
{
    public AdminsEditViewModel()
    {
        this.Admin = new Admin(); // this is an Admin class
    }

    public IEnumerable<SelectListItem> SelectAdminsInGroup { get; set; }


    public IEnumerable<SelectListItem> SelectAdminsNotInGroup { get; set; }

    public Admin Admin { get; set; }
}

在这行PropertiesMustMatchAttribute

上我得到null异常
object originalValue = properties.Find(OriginalProperty,  true /* ignoreCase */).GetValue(value);

因为Password字段是Admin类的属性而不是AdminsEditViewModel。如何在ViewModel AdminsEditViewModel中找到Admin的属性之前,它会如此深入? 感谢

1 个答案:

答案 0 :(得分:1)

您需要修改PropertiesMustMatchAttribute类来解析属性名称并深入搜索。

此属性不是框架的一部分;它包含在默认的MVC模板中(在AccountModels.cs中)
因此,您可以根据自己的需要对其进行修改。

具体来说,您可以调用name.Split('.'),然后遍历拆分名称并获取属性值 它看起来像

object GetValue(object obj, string properties) {
    foreach(strong prop in properties)
        obj = TypeDescriptor.GetProperties(obj)
                            .Find(prop, ignoreCase: true)
                            .GetValue(obj);
    }
    return obj;
}