1

ASP.NET MVC 3での検証の完全ガイドの例を使用して、 RequiredIf検証属性を作成しています(「より複雑なカスタムバリデーター」という見出しの下のページの約1/3です)。1つのシナリオを除いて、すべて正常に機能します。それは、複雑なタイプに対して検証する必要がある場合です。たとえば、次のモデルがあります。

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"。残念ながら、アドレスはメインモデルのサブタイプであるため、DontUseだけでなく、HomeAddress_DontUseという名前で装飾する必要あります

不思議なことに、検証はサーバー側の検証では正常に機能しますが、JSは「DontUse」という名前のオブジェクトを見つけることができないため、クライアント側の控えめな検証はJSエラーで失敗します。

したがって、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.unobstrusive.jsのequaltoメソッドを参考にしてください。

于 2012-04-19T20:47:18.567 に答える