1

私はこのViewModelを持っています

public class CustomerSuscribeViewModel : IValidatableObject
{
    [DataMember(IsRequired = true)]
    [DataType(DataType.Text)]
    public string Name { get; set; }

    public string SurName { get; set; }

    [DataMember(IsRequired = true)]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataMember(IsRequired = true)]
    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }

    [DataMember(IsRequired = true)]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [Inject]
    public IDataUsers DataUsers { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {

        if(DataUsers.Get(new UserFilter() {Email = Email}).Any())
        {
            yield return new ValidationResult(This Email is already used.",new string[]{"Email"});
        }
        if(ConfirmPassword != Password)
            yield return new ValidationResult("Please confirm your apssword", new string[] { "Password", "ConfirmPassword" });
    }
}

そしてこの行動

[HttpPost]
        public ActionResult Suscribe(CustomerSuscribeViewModel customer)
        {
            if (!ModelState.IsValid)
                return View(customer);

問題は、メンバーDataUsersが作成されないため、NullReferenceExceptionが発生することです。

バインディングは次の方法で行われます。

Bind<IDataUsers>().To<DataUsers>();

何か案が ?

編集:InjectAttributeは、コントローラー内のプロパティに対して適切に機能します。

環境:asp.net mvc 3、ninject 2.2(おそらく更新する必要がありますか?)

4

1 に答える 1

5

ビュー モデルは Ninject によって作成されないため、inject 属性は無視されます。通常、ビュー モデルはシンプルに保ち、依存関係を持たないようにする必要があります。ValidationAttributeの代わりに s を使用してそこに到達できますIValidatableObject

検証属性の注入については、https://github.com/ninject/ninject.web.mvc/wiki/Injection-of-validatorsを参照してください。

を使用してパスワードと確認パスワードの照合を検証する方法の例を次に示しますValidationAttribute

于 2012-06-15T13:38:01.300 に答える