これら 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 が返され、エラーが発生します。したがって、ここでの私の質問は次のようになると思います。
- 割り当てられたモデル名 ("Model1Name") を取得してプロパティ名を追加する方法はありますか?
- 割り当てられたモデル名を 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が返されます。
どんな助けでも大歓迎です。ありがとう。