从自定义ValidationAttribute中的ModelClientValidationRequiredIfRule方法获取Complex Type的全名

时间:2012-04-19 20:27:24

标签: asp.net-mvc-3 complextype validationattribute

我正在使用 The Complete Guide To Validation In ASP.NET MVC 3 中的示例来创建 RequiredIf 验证属性(它在“更复杂的自定义验证器“)。除了一个场景之外,一切正常,这就是我需要针对复杂类型进行验证。例如,我有以下模型:

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_DontUse 的名称进行修饰,而不仅仅是 DontUse

奇怪的是,验证适用于服务器端验证,但客户端不显眼的验证因JS错误而失败,因为JS找不到名称只是“DontUse”的对象。

因此,我需要找到一种方法来更改ModelClientValidationRequiredIfRule方法,以便知道它正在验证的属性是父类型的子类型,如果是,则将ParentType_添加到“otherProperty”之前字段(例如otherProperty变为HomeAddress_DontUse

我尝试传入typeof(MemberAddressModel)作为属性的参数,但即使在调试属性创建时,我似乎也找不到对该类型的HomeAddress或WorkAddress的父类型的引用。

2 个答案:

答案 0 :(得分:2)

根据The Flower Guy的建议,我能够提出以下似乎有效的方法。我只是在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 :(得分:1)

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

jQuery.validator.addMethod(" requiredif" ...

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