0

これら 2 つのモデル クラスを 1 つのモデルにラップしています。厳密に型指定されたビューとサーバー側の検証は十分に機能しますが、このラップされたモデル クラスに対してクライアント側の検証が機能しません。

クライアント側のコードは次のとおりです。

Sys.Mvc.ValidatorRegistry.validators.usernameEmail = function (rule) {

    var emailProperty = rule.ValidationParameters.emailProperty;
    var message = rule.ErrorMessage;

    return function (value, context) {
        if (!value || !value.length) {
            return true;
        }

        var usernameField = context.fieldContext.elements[0];
        var emailFieldId = $('input[name = "' + emailProperty + '"]').attr('id');
        var emailField = $get(emailFieldId, usernameField.form);

        //...validation stuff...

    };
};

問題は、emailProperty がそのモデルに記載されているプロパティ名のみを返すことです。「EmailAddress」ですが、厳密に型指定されたビューは、次のように呼び出されるため、「Model1Name.EmailAddress」として名前を割り当てます。

<%: Html.TextBoxFor(m => m.Model1Name.EmailAddress)%>

したがって、プロパティを検索すると null が返され、エラーが発生します。したがって、ここでの私の質問は次のようになると思います。

  1. 割り当てられたモデル名 ("Model1Name") を取得してプロパティ名を追加する方法はありますか?
  2. 割り当てられたモデル名を DataAnnotations/ModelValidationRule クラスから渡すことはできますか? もしそうなら、どのように?

ここに私のモデルクラスがあります:

public class Model1
{
    public string EmailAddress{ get; set; }
    ...
}

public class Model2
{
    [UsernameEmail]
    public string Username{ get; set; }
    ...
}

public class WrappedModel
{
    public Model1 Model1Name{ get; set; }
    public Model2 Model2Name { get; set; }
}

補足: クライアント側の検証は、単一のモデル ビューに対して適切に機能します。

編集 多くのデバッグの後、私はそれを知りました

viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId("EmailAddress");

私のDataAnnotationsModelValidatorでは、パラメーター名「EmailAddress」のみが返され、そのプレフィックス「Model1Name」が省略されているため、間違ったIDが返されます。

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0

カスタム [UsenameEmail] 属性は、正しいクライアント側の検証メタデータを発行する役割を果たします。より正確には、そのために登録されたバリデータアダプタが必要です。アダプターが完全なプロパティ名、つまり「Model1Name.EmailAddress」を生成することを確認する必要があります。その後、「usernameEmail」クライアント側関数は正しいフィールド名を受け取り、期待どおりに動作します。

詳細については、「DataAnnotationsModelValidatorProvider.RegisterAdapter(...)」を参照してください。これが実装サンプルです - http://weblogs.asp.net/jacqueseloff/archive/2009/12/17/asp-net-mvc-2-rc-validating-credit-card-numbers.aspx

于 2011-09-05T07:49:08.083 に答える