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 を使用して実行できます)。属性UserPrototypeを削除するためだけにクラスを複製することは避けたいと思います。Required

4

2 に答える 2

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
    */
}
于 2012-05-06T21:23:59.900 に答える
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";
        }
    }
}
于 2012-05-06T21:41:17.273 に答える