10

次のようなクラスユーザーがあります。

public class User
{
    public int UserId { get; set; }

    [Required(ErrorMessage = "A username is required.")]
    [StringLength(20, ErrorMessage = "Your username must be 4-20 characters.", MinimumLength = 4)]
    [RegularExpression("^[a-zA-Z0-9]*$", ErrorMessage = "Your username can only consist of letters and numbers.")]
    [Remote("UsernameExists", "RemoteValidation", ErrorMessage = "Username is already taken")]
    public string Username { get; set; }

    [Required(ErrorMessage = "A password is required.")]
    [MinLength(4, ErrorMessage = "Your password must have at least 4 letters.")]
    public string Password { get; set; }

    [Required(ErrorMessage = "An email address is required.")]
    public string Email { get; set; }
}

登録機能のために、User オブジェクトとパスワード確認用の文字列を保持する ViewModel を作成しました。

public class RegistrationViewModel
{
    public User User { get; set; }

    [DisplayName("Password confirmation")]
    [Required, Compare("User.Password", ErrorMessage = "The password do not match")]
    public string PasswordConfirmation { get; set; }
}

私が遭遇する最初の問題は、ユーザーのプロパティが見つからないように見えるため、 Compare("User.Password") の検証が機能しないように見えることです。User.Password プロパティに対して PasswordConfirmation プロパティを検証する方法はありますか?

2 番目の問題は、ユーザー名フィールドのリモート検証です。http://davidhayden.com/blog/dave/archive/2011/01/04/ASPNETMVC3RemoteValidationTutorial.aspxにあるDavid Hayden のチュートリアルに従いましたが、UsernameExists メソッドのパラメーター username は常に null です。ここで何か不足していますか?

編集:

申し訳ありませんが、パスワードの比較で受け取ったエラーについては、実際には十分に明確ではありませんでした。フィールドに入力すると問題なく動作しますが、パスワードが一致しない場合はエラーが表示されます。ただし、フォームを送信すると、検証の概要に次のエラーが表示されます: UserToRegister.Password という名前のプロパティが見つかりませんでした。

編集2:

ジョーの投稿のおかげで、問題の一部がわかりました。リモートバリデーターは、コントローラーアクションのユーザー名パラメーターと明らかに一致しない URL/?UserToRegister.Username=temp をポストバックします。アクション パラメータを UserToRegister.Username にマップするには、次のものが必要です。

public ActionResult UsernameExists([Bind(Prefix = "UserToRegister.Username")]string username)

これにより、パラメーターがメソッドに正しく渡されるようになりました。ただし、パスワード フィールドで Compare 属性を使用すると、まだエラーが発生します。

ありがとう。

4

3 に答える 3

5

User.Password プロパティに対する PasswordConfigurmation プロパティの検証に関する問題は、「jquery.validate.unobtrusive.js」ファイルのバグが原因です。

もともと、jquery の「equalTo」関数は次のとおりです。

adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

setValidationValues(options, "equalTo", element);
});

この行を変更するだけです:

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

に:

element = $(options.form).find(":input[name='" + fullOtherName + "']")[0];

「fullOtherName」セレクターを一重引用符で囲んでいることに注意してください。この変更を行うと、クライアント側の検証が期待どおりに機能します。

于 2012-03-01T20:33:22.173 に答える
1

リモート検証の部分では、何も飛び出しません。Firebugを開いて、発生しているリクエストがどのように見えるかを確認すると役立つ場合があります。すべてが適切に配線されている場合は、このようなものが大まかに表示されるはずです...

http:// localhost:14547 / [Controller] / [ActionName]?[ParamName] = [paramValue]

指定したリクエストから、最終的に行ったようにプレフィックスを使用するか、アクションにUserToRegisterという名前のユーザーを取得させ、アクション内でUserNameプロパティにアクセスすることができます。これは、オブジェクトのリモート検証を処理するための推奨される方法であり、Bind属性を使用するよりも少し簡単に考えることができます。

比較検証の場合、クライアント側では検証は成功しているように見えますが、検証コンテキストにはUser.Passwordという名前のプロパティが含まれておらず、Userという名前のプロパティのみが含まれているため、サーバー側では検証が失敗します。

于 2011-02-17T01:21:49.207 に答える
0

この場合、継承は機能を追加する標準的な方法のようです。RegistrationViewModelから派生させるのはどうですかUserViewModel

public class RegistrationViewModel : UserViewModel
{
    [DisplayName("Password confirmation")]
    [Required]
    [Compare("Password", ErrorMessage = "The password do not match")]
    public string PasswordConfirmation { get; set; }
}

と:

public ActionResult UsernameExists(string Username)
{
   ...
}
于 2011-02-17T07:11:16.050 に答える