2012-04-19 56 views
0

我使用的例子在The Complete Guide To Validation In ASP.NET MVC 3创建RequiredIf验证特性(这是约1/3在网页的“一个更复杂的标题下定制验证器“)。除了一个场景外,这一切都可以正常工作,这就是说,如果我需要针对复杂类型进行验证。例如,我有以下型号:获取从ModelClientValidationRequiredIfRule方法在自定义复杂类型的全名ValidationAttribute

public class MemberDetailModel 
{ 
    public int MemberId { get; set; } 
    // Other model properties here 
    public MemberAddressModel HomeAddress { get; set; } 
    public MemberAddressModel WorkAddress { get; set; } 
} 

public class MemberAddressModel 
{ 
    public bool DontUse { get; set; } 
    // Other model properties here 

    [RequiredIf("DontUse", Comparison.IsEqualTo, false)] 
    public string StreetAddress1 { get; set; } 
} 

的问题是,当该物业的StreetAddress属性验证呈现,得到它的装饰与data-val-requiredif-other="DontUse"属性。不幸的是,由于该地址是主模型的子类型,因此需要用名称HomeAddress_Dont使用而不仅仅是Dont使用来装饰。

非常奇怪的是,验证对服务器端验证工作正常,但客户端不显眼的验证失败,JS错误,因为JS无法找到名为“DontUse”的对象。

所以,我需要找到一个方法来改变ModelClientValidationRequiredIfRule方法知道它是验证属性是子类型父类型的,如果是这样,在前面加上了ParentType_的“otherProperty”字段(如otherProperty成为HomeAddress_DontUse

我曾尝试在typeof(MemberAddressModel)传递作为属性的参数,但是在调试的属性创建即使,我似乎无法找到由于该类型是homeAddress或招聘人数的父类的任何引用。

回答

1

根据花人的建议,我能够想出下面这似乎工作。我简单地修改在customValidation.js文件中的以下:

jQuery.validator.addMethod("requiredif", function (value, element, params) { 
    if ($(element).val() != '') return true; 
    var prefix = getModelPrefix(element.name); // NEW LINE 
    var $other = $('#' + prefix + params.other); // MODIFIED LINE 
    var otherVal = ($other.attr('type').toUpperCase() == "CHECKBOX") ? ($other.attr("checked") ? "true" : "false") : $other.val(); 
    return params.comp == 'isequalto' ? (otherVal != params.value) : (otherVal == params.value); 
}); 

我还增加了以下方法,以该文件(JQuery的块内,以便仅专用可访问):

function getModelPrefix(fieldName) { 
    return fieldName.substr(0, fieldName.lastIndexOf(".") + 1).replace(".","_"); 
} 
1

现在不能完全做到这一点,但问题出在客户端javascript函数中:

jQuery.validator.addMethod(“requiredif” ......

JS的不够尖端,以应对复杂的视图模型,其中可能有型号前缀。如果你看看微软的jquery.validate.unobstrusive.js(在每个MVC3应用程序的脚本文件夹中),你会发现一些有用的方法,包括getModelPrefix和appendModelPrefix。您可以采取类似的方法并更改requiredIf验证方法 - 查看jquery.validate.unobstrusive.js中的equalto方法以获得帮助。

+0

感谢信息。我看到MS在jquery.validate.unobstrusive.js中使用的函数,但我不太清楚如何在我的JS文件中实现它们。如果你有机会,任何帮助将不胜感激,否则,我会继续玩弄弄清楚。 – bigmac 2012-04-19 22:55:17

相关问题