1

我正在使用The Complete Guide To Validation In ASP.NET MVC 3中的示例来创建RequiredIf验证属性(它位于“更复杂的自定义验证器”标题下的页面下方约 1/3 )。除了一种情况外,这一切都很好,那就是如果我需要针对复杂类型进行验证。例如,我有以下模型:

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 的父类型的任何引用。

4

2 回答 2

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(".","_");
}
于 2012-04-25T19:39:47.407 回答
1

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

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

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

于 2012-04-19T20:47:18.567 回答