2012-05-06 9 views
3

私の現在のWebプロジェクトには、ユーザの詳細を編集できる管理インタフェースがあります(実際には革命的ではありません...)。ビューは、検証して、ユーザーの強く型付けされたモデルを使用しています属性:ユーザーが更新されると汚れた入力のみを確認する

public class UserPrototype 
{ 
    [Required] 
    [StringLength(50, MinimumLength = 4)] 
    public string Username { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1] 
    public string LastName { get; set; } 

    [Required] 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 

    /* 
     And so on 
    */ 
} 

、私は、データベースに実際に変更されたフィールドを更新したいと思います。主な理由はパスワードフィールドです。パスワードはもちろんハッシュとして保存されるので、ユーザーが編集のために再調整されても、そのフィールドには何も意味がありません。しかし、モデルバインダーの検証には有効なパスワードが必要です。

私はまだ同じクラスを使用できますが、何らかの形で変更されたものとして提出されたフィールドを検証するだけです(これは私がJavaScriptでも達成できます)。 Required属性を削除するだけでUserPrototypeクラスを複製しないようにしたいと思います。

答えて

1

継承を使用すると、この方法で複製する必要はありません。

public class BaseUserPrototype 
{ 
    [Required] 
    [StringLength(50, MinimumLength = 4)] 
    public string Username { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1] 
    public string LastName { get; set; } 

    /* 
     And so on 
    */ 
} 

public class NewUserPrototype: BaseUserPrototype 
{ 
    [Required] 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 

    /* 
     And so on 
    */ 
} 
public class EditUserPrototype: BaseUserPrototype 
{ 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 
    /* 
     And so on 
    */ 
} 
+0

あと、パスワードを変更することも可能です。しかし、パスワードを知っているだけで、他のパラメータを変更するためにそれを再入力する必要はありません... – carlpett

+0

私の答えを更新しました。編集シナリオで、必要な属性を削除します。 –

0

IDataErrorInfoインターフェイスを使用できます。 この方法であなたのエンティティに実装してください:

public class Entity: IDataErrorInfo 
{ 
// this is the dictionary of errors 
    private readonly Dictionary<string, string> _errors = new Dictionary<string, string>(); 
    private string _password; 

    public string Password 
    { 
     get{return _password;} 
     set 
     { 
     // YOUR ACTUAL VALIDATION CODE HERE. IF THERE IS A VALIDATION ERROR - ADD IT TO THE DICTIONARY 
      if(string.IsNullOrEmpty(value)) 
      _errors["Password"] = "Error with password field"; 
     } 
    } 
} 
関連する問題